24template <
int dim,
int spacedim>
31 std::vector<
bool>(compute_num_dofs(order), true),
41 for (
unsigned int comp = 0; comp < this->
n_components(); ++comp)
53template <
int dim,
int spacedim>
64template <
int dim,
int spacedim>
69 const unsigned int )
const
78template <
int dim,
int spacedim>
89template <
int dim,
int spacedim>
94 const unsigned int )
const
102template <
int dim,
int spacedim>
113template <
int dim,
int spacedim>
118 const unsigned int )
const
126template <
int dim,
int spacedim>
127std::unique_ptr<typename ::FiniteElement<dim, spacedim>::InternalDataBase>
137 typename ::FiniteElement<dim, spacedim>::InternalDataBase>
138 data_ptr = std::make_unique<InternalData>();
140 data.update_each = requires_update_flags(update_flags);
143 const unsigned int degree(this->degree - 1);
149 const unsigned int n_line_dofs = this->n_dofs_per_line() * lines_per_cell;
152 const unsigned int n_face_dofs = this->n_dofs_per_quad(0) * faces_per_cell;
155 const unsigned int n_q_points = quadrature.
size();
158 data.sigma_imj_values.resize(
160 std::vector<std::vector<double>>(vertices_per_cell,
161 std::vector<double>(vertices_per_cell)));
163 data.sigma_imj_grads.resize(vertices_per_cell,
164 std::vector<std::vector<double>>(
165 vertices_per_cell, std::vector<double>(dim)));
170 data.shape_values.resize(this->n_dofs_per_cell(),
176 data.shape_grads.resize(this->n_dofs_per_cell(),
186 std::vector<Point<dim>> p_list(n_q_points);
196 std::vector<std::vector<double>> sigma(
197 n_q_points, std::vector<double>(lines_per_cell));
198 std::vector<std::vector<double>> lambda(
199 n_q_points, std::vector<double>(lines_per_cell));
201 for (
unsigned int q = 0; q < n_q_points; ++q)
203 sigma[q][0] = (1.0 - p_list[q][0]) + (1.0 - p_list[q][1]);
204 sigma[q][1] = p_list[q][0] + (1.0 - p_list[q][1]);
205 sigma[q][2] = (1.0 - p_list[q][0]) + p_list[q][1];
206 sigma[q][3] = p_list[q][0] + p_list[q][1];
208 lambda[q][0] = (1.0 - p_list[q][0]) * (1.0 - p_list[q][1]);
209 lambda[q][1] = p_list[q][0] * (1.0 - p_list[q][1]);
210 lambda[q][2] = (1.0 - p_list[q][0]) * p_list[q][1];
211 lambda[q][3] = p_list[q][0] * p_list[q][1];
212 for (
unsigned int i = 0; i < vertices_per_cell; ++i)
214 for (
unsigned int j = 0; j < vertices_per_cell; ++j)
216 data.sigma_imj_values[q][i][j] =
217 sigma[q][i] - sigma[q][j];
230 {-1, -1}, {1, -1}, {-1, 1}, {1, 1}};
231 int sigma_imj_sign[vertices_per_cell][vertices_per_cell];
232 unsigned int sigma_imj_component[vertices_per_cell]
235 for (
unsigned int i = 0; i < vertices_per_cell; ++i)
237 for (
unsigned int j = 0; j < vertices_per_cell; ++j)
244 sigma_imj_sign[i][j] = (i < j) ? -1 : 1;
245 sigma_imj_sign[i][j] = (i == j) ? 0 : sigma_imj_sign[i][j];
249 sigma_imj_component[i][j] = 0;
250 for (
unsigned int d = 0;
d < dim; ++
d)
253 sigma_comp_signs[i][
d] - sigma_comp_signs[j][
d];
258 sigma_imj_component[i][j] =
d;
265 data.sigma_imj_grads[i][j][sigma_imj_component[i][j]] =
266 2.0 * sigma_imj_sign[i][j];
274 data.edge_sigma_values.resize(lines_per_cell);
275 data.edge_sigma_grads.resize(lines_per_cell);
276 for (
unsigned int m = 0; m < lines_per_cell; ++m)
278 data.edge_sigma_values[m].resize(n_q_points);
281 data.edge_sigma_grads[m].resize(dim);
291 data.edge_lambda_values.resize(lines_per_cell,
292 std::vector<double>(n_q_points));
293 data.edge_lambda_grads_2d.resize(lines_per_cell,
294 std::vector<double>(dim));
295 for (
unsigned int m = 0; m < lines_per_cell; ++m)
300 const unsigned int e1(
302 const unsigned int e2(
304 for (
unsigned int q = 0; q < n_q_points; ++q)
306 data.edge_sigma_values[m][q] =
307 data.sigma_imj_values[q][e2][e1];
308 data.edge_lambda_values[m][q] = lambda[q][e1] + lambda[q][e2];
311 data.edge_sigma_grads[m][edge_sigma_direction[m]] = -2.0;
313 data.edge_lambda_grads_2d[0] = {-1.0, 0.0};
314 data.edge_lambda_grads_2d[1] = {1.0, 0.0};
315 data.edge_lambda_grads_2d[2] = {0.0, -1.0};
316 data.edge_lambda_grads_2d[3] = {0.0, 1.0};
384 const unsigned int cell_type1_offset = n_line_dofs;
391 const unsigned int cell_type2_offset =
392 cell_type1_offset + degree * degree;
400 const unsigned int cell_type3_offset1 =
401 cell_type2_offset + degree * degree;
402 const unsigned int cell_type3_offset2 = cell_type3_offset1 + degree;
407 std::vector<Point<dim>> cell_points(n_q_points);
408 for (
unsigned int q = 0; q < n_q_points; ++q)
410 for (
unsigned int d = 0;
d < dim; ++
d)
412 cell_points[q][
d] = 2.0 * p_list[q][
d] - 1.0;
417 for (
unsigned int q = 0; q < n_q_points; ++q)
431 const unsigned int poly_length(
434 std::vector<std::vector<double>> polyx(
435 degree, std::vector<double>(poly_length));
436 std::vector<std::vector<double>> polyy(
437 degree, std::vector<double>(poly_length));
438 for (
unsigned int i = 0; i < degree; ++i)
443 IntegratedLegendrePolynomials[i + 2].value(
444 cell_points[q][0], polyx[i]);
445 IntegratedLegendrePolynomials[i + 2].value(
446 cell_points[q][1], polyy[i]);
451 for (
unsigned int j = 0; j < degree; ++j)
453 const unsigned int shift_j(j * degree);
454 for (
unsigned int i = 0; i < degree; ++i)
456 const unsigned int shift_ij(i + shift_j);
459 const unsigned int dof_index1(cell_type1_offset +
461 data.shape_values[dof_index1][q][0] =
462 2.0 * polyx[i][1] * polyy[j][0];
463 data.shape_values[dof_index1][q][1] =
464 2.0 * polyx[i][0] * polyy[j][1];
467 const unsigned int dof_index2(cell_type2_offset +
469 data.shape_values[dof_index2][q][0] =
470 data.shape_values[dof_index1][q][0];
471 data.shape_values[dof_index2][q][1] =
472 -1.0 * data.shape_values[dof_index1][q][1];
475 const unsigned int dof_index3_1(cell_type3_offset1 +
477 data.shape_values[dof_index3_1][q][0] = polyy[j][0];
478 data.shape_values[dof_index3_1][q][1] = 0.0;
480 const unsigned int dof_index3_2(cell_type3_offset2 +
482 data.shape_values[dof_index3_2][q][0] = 0.0;
483 data.shape_values[dof_index3_2][q][1] = polyx[j][0];
488 for (
unsigned int j = 0; j < degree; ++j)
490 const unsigned int shift_j(j * degree);
491 for (
unsigned int i = 0; i < degree; ++i)
493 const unsigned int shift_ij(i + shift_j);
496 const unsigned int dof_index1(cell_type1_offset +
498 data.shape_grads[dof_index1][q][0][0] =
499 4.0 * polyx[i][2] * polyy[j][0];
500 data.shape_grads[dof_index1][q][0][1] =
501 4.0 * polyx[i][1] * polyy[j][1];
502 data.shape_grads[dof_index1][q][1][0] =
503 data.shape_grads[dof_index1][q][0][1];
504 data.shape_grads[dof_index1][q][1][1] =
505 4.0 * polyx[i][0] * polyy[j][2];
508 const unsigned int dof_index2(cell_type2_offset +
510 data.shape_grads[dof_index2][q][0][0] =
511 data.shape_grads[dof_index1][q][0][0];
512 data.shape_grads[dof_index2][q][0][1] =
513 data.shape_grads[dof_index1][q][0][1];
514 data.shape_grads[dof_index2][q][1][0] =
515 -1.0 * data.shape_grads[dof_index1][q][1][0];
516 data.shape_grads[dof_index2][q][1][1] =
517 -1.0 * data.shape_grads[dof_index1][q][1][1];
520 const unsigned int dof_index3_1(cell_type3_offset1 +
522 data.shape_grads[dof_index3_1][q][0][0] = 0.0;
523 data.shape_grads[dof_index3_1][q][0][1] =
525 data.shape_grads[dof_index3_1][q][1][0] = 0.0;
526 data.shape_grads[dof_index3_1][q][1][1] = 0.0;
528 const unsigned int dof_index3_2(cell_type3_offset2 +
530 data.shape_grads[dof_index3_2][q][0][0] = 0.0;
531 data.shape_grads[dof_index3_2][q][0][1] = 0.0;
532 data.shape_grads[dof_index3_2][q][1][0] =
534 data.shape_grads[dof_index3_2][q][1][1] = 0.0;
545 std::vector<std::vector<double>> sigma(
546 n_q_points, std::vector<double>(lines_per_cell));
547 std::vector<std::vector<double>> lambda(
548 n_q_points, std::vector<double>(lines_per_cell));
549 for (
unsigned int q = 0; q < n_q_points; ++q)
551 sigma[q][0] = (1.0 - p_list[q][0]) + (1.0 - p_list[q][1]) +
554 p_list[q][0] + (1.0 - p_list[q][1]) + (1 - p_list[q][2]);
556 (1.0 - p_list[q][0]) + p_list[q][1] + (1 - p_list[q][2]);
557 sigma[q][3] = p_list[q][0] + p_list[q][1] + (1 - p_list[q][2]);
559 (1.0 - p_list[q][0]) + (1.0 - p_list[q][1]) + p_list[q][2];
560 sigma[q][5] = p_list[q][0] + (1.0 - p_list[q][1]) + p_list[q][2];
561 sigma[q][6] = (1.0 - p_list[q][0]) + p_list[q][1] + p_list[q][2];
562 sigma[q][7] = p_list[q][0] + p_list[q][1] + p_list[q][2];
564 lambda[q][0] = (1.0 - p_list[q][0]) * (1.0 - p_list[q][1]) *
565 (1.0 - p_list[q][2]);
567 p_list[q][0] * (1.0 - p_list[q][1]) * (1.0 - p_list[q][2]);
569 (1.0 - p_list[q][0]) * p_list[q][1] * (1.0 - p_list[q][2]);
570 lambda[q][3] = p_list[q][0] * p_list[q][1] * (1.0 - p_list[q][2]);
572 (1.0 - p_list[q][0]) * (1.0 - p_list[q][1]) * p_list[q][2];
573 lambda[q][5] = p_list[q][0] * (1.0 - p_list[q][1]) * p_list[q][2];
574 lambda[q][6] = (1.0 - p_list[q][0]) * p_list[q][1] * p_list[q][2];
575 lambda[q][7] = p_list[q][0] * p_list[q][1] * p_list[q][2];
579 for (
unsigned int i = 0; i < vertices_per_cell; ++i)
581 for (
unsigned int j = 0; j < vertices_per_cell; ++j)
583 data.sigma_imj_values[q][i][j] =
584 sigma[q][i] - sigma[q][j];
617 int sigma_imj_sign[vertices_per_cell][vertices_per_cell];
618 unsigned int sigma_imj_component[vertices_per_cell]
621 for (
unsigned int i = 0; i < vertices_per_cell; ++i)
623 for (
unsigned int j = 0; j < vertices_per_cell; ++j)
630 sigma_imj_sign[i][j] = (i < j) ? -1 : 1;
631 sigma_imj_sign[i][j] = (i == j) ? 0 : sigma_imj_sign[i][j];
635 sigma_imj_component[i][j] = 0;
636 for (
unsigned int d = 0;
d < dim; ++
d)
639 sigma_comp_signs[i][
d] - sigma_comp_signs[j][
d];
644 sigma_imj_component[i][j] =
d;
651 data.sigma_imj_grads[i][j][sigma_imj_component[i][j]] =
652 2.0 * sigma_imj_sign[i][j];
659 data.edge_sigma_values.resize(lines_per_cell);
660 data.edge_lambda_values.resize(lines_per_cell);
661 data.edge_sigma_grads.resize(lines_per_cell);
662 data.edge_lambda_grads_3d.resize(lines_per_cell);
663 data.edge_lambda_gradgrads_3d.resize(lines_per_cell);
664 for (
unsigned int m = 0; m < lines_per_cell; ++m)
666 data.edge_sigma_values[m].resize(n_q_points);
667 data.edge_lambda_values[m].resize(n_q_points);
670 data.edge_sigma_grads[m].resize(dim);
672 data.edge_lambda_grads_3d[m].resize(n_q_points);
673 for (
unsigned int q = 0; q < n_q_points; ++q)
675 data.edge_lambda_grads_3d[m][q].resize(dim);
679 data.edge_lambda_gradgrads_3d[m].resize(dim);
680 for (
unsigned int d = 0;
d < dim; ++
d)
682 data.edge_lambda_gradgrads_3d[m][
d].resize(dim);
689 1, 1, 0, 0, 1, 1, 0, 0, 2, 2, 2, 2};
691 for (
unsigned int m = 0; m < lines_per_cell; ++m)
696 const unsigned int e1(
698 const unsigned int e2(
701 for (
unsigned int q = 0; q < n_q_points; ++q)
703 data.edge_sigma_values[m][q] =
704 data.sigma_imj_values[q][e2][e1];
705 data.edge_lambda_values[m][q] = lambda[q][e1] + lambda[q][e2];
708 data.edge_sigma_grads[m][edge_sigma_direction[m]] = -2.0;
711 for (
unsigned int q = 0; q < n_q_points; ++q)
713 double x(p_list[q][0]);
714 double y(p_list[q][1]);
715 double z(p_list[q][2]);
716 data.edge_lambda_grads_3d[0][q] = {z - 1.0, 0.0, x - 1.0};
717 data.edge_lambda_grads_3d[1][q] = {1.0 - z, 0.0, -x};
718 data.edge_lambda_grads_3d[2][q] = {0.0, z - 1.0, y - 1.0};
719 data.edge_lambda_grads_3d[3][q] = {0.0, 1.0 - z, -y};
720 data.edge_lambda_grads_3d[4][q] = {-z, 0.0, 1.0 - x};
721 data.edge_lambda_grads_3d[5][q] = {z, 0.0, x};
722 data.edge_lambda_grads_3d[6][q] = {0.0, -z, 1.0 - y};
723 data.edge_lambda_grads_3d[7][q] = {0.0, z, y};
724 data.edge_lambda_grads_3d[8][q] = {y - 1.0, x - 1.0, 0.0};
725 data.edge_lambda_grads_3d[9][q] = {1.0 - y, -x, 0.0};
726 data.edge_lambda_grads_3d[10][q] = {-y, 1.0 - x, 0.0};
727 data.edge_lambda_grads_3d[11][q] = {y, x, 0.0};
757 for (
unsigned int m = 0; m < lines_per_cell; ++m)
759 data.edge_lambda_gradgrads_3d[m][edge_lambda_directions[m][0]]
760 [edge_lambda_directions[m][1]] =
762 data.edge_lambda_gradgrads_3d[m][edge_lambda_directions[m][1]]
763 [edge_lambda_directions[m][0]] =
771 data.face_lambda_values.resize(faces_per_cell);
772 data.face_lambda_grads.resize(faces_per_cell);
774 for (
unsigned int m = 0; m < faces_per_cell; ++m)
776 data.face_lambda_values[m].resize(n_q_points);
777 data.face_lambda_grads[m].resize(3);
780 for (
unsigned int q = 0; q < n_q_points; ++q)
782 double x(p_list[q][0]);
783 double y(p_list[q][1]);
784 double z(p_list[q][2]);
785 data.face_lambda_values[0][q] = 1.0 - x;
786 data.face_lambda_values[1][q] = x;
787 data.face_lambda_values[2][q] = 1.0 - y;
788 data.face_lambda_values[3][q] = y;
789 data.face_lambda_values[4][q] = 1.0 - z;
790 data.face_lambda_values[5][q] = z;
793 data.face_lambda_grads[0] = {-1.0, 0.0, 0.0};
794 data.face_lambda_grads[1] = {1.0, 0.0, 0.0};
795 data.face_lambda_grads[2] = {0.0, -1.0, 0.0};
796 data.face_lambda_grads[3] = {0.0, 1.0, 0.0};
797 data.face_lambda_grads[4] = {0.0, 0.0, -1.0};
798 data.face_lambda_grads[5] = {0.0, 0.0, 1.0};
811 const unsigned int cell_type1_offset(n_line_dofs +
824 const unsigned int cell_type2_offset1(
825 cell_type1_offset + degree * degree * degree);
826 const unsigned int cell_type2_offset2(
827 cell_type2_offset1 + degree * degree * degree);
837 const unsigned int cell_type3_offset1(
838 cell_type2_offset2 + degree * degree * degree);
839 const unsigned int cell_type3_offset2(cell_type3_offset1 +
841 const unsigned int cell_type3_offset3(cell_type3_offset2 +
845 std::vector<Point<dim>> cell_points(n_q_points);
846 for (
unsigned int q = 0; q < n_q_points; ++q)
848 for (
unsigned int d = 0;
d < dim; ++
d)
850 cell_points[q][
d] = 2.0 * p_list[q][
d] - 1.0;
857 const unsigned int poly_length(
860 for (
unsigned int q = 0; q < n_q_points; ++q)
868 std::vector<std::vector<double>> polyx(
869 degree, std::vector<double>(poly_length));
870 std::vector<std::vector<double>> polyy(
871 degree, std::vector<double>(poly_length));
872 std::vector<std::vector<double>> polyz(
873 degree, std::vector<double>(poly_length));
874 for (
unsigned int i = 0; i < degree; ++i)
877 IntegratedLegendrePolynomials[i + 2].value(
878 cell_points[q][0], polyx[i]);
879 IntegratedLegendrePolynomials[i + 2].value(
880 cell_points[q][1], polyy[i]);
881 IntegratedLegendrePolynomials[i + 2].value(
882 cell_points[q][2], polyz[i]);
887 for (
unsigned int k = 0; k < degree; ++k)
889 const unsigned int shift_k(k * degree * degree);
890 const unsigned int shift_j(
893 for (
unsigned int j = 0; j < degree; ++j)
895 const unsigned int shift_jk(j * degree +
897 for (
unsigned int i = 0; i < degree; ++i)
899 const unsigned int shift_ijk(shift_jk +
903 const unsigned int dof_index1(
904 cell_type1_offset + shift_ijk);
906 data.shape_values[dof_index1][q][0] =
907 2.0 * polyx[i][1] * polyy[j][0] *
909 data.shape_values[dof_index1][q][1] =
910 2.0 * polyx[i][0] * polyy[j][1] *
912 data.shape_values[dof_index1][q][2] =
913 2.0 * polyx[i][0] * polyy[j][0] *
917 const unsigned int dof_index2_1(
918 cell_type2_offset1 + shift_ijk);
919 const unsigned int dof_index2_2(
920 cell_type2_offset2 + shift_ijk);
922 data.shape_values[dof_index2_1][q][0] =
923 data.shape_values[dof_index1][q][0];
924 data.shape_values[dof_index2_1][q][1] =
926 data.shape_values[dof_index1][q][1];
927 data.shape_values[dof_index2_1][q][2] =
928 data.shape_values[dof_index1][q][2];
930 data.shape_values[dof_index2_2][q][0] =
931 data.shape_values[dof_index1][q][0];
932 data.shape_values[dof_index2_2][q][1] =
934 data.shape_values[dof_index1][q][1];
935 data.shape_values[dof_index2_2][q][2] =
937 data.shape_values[dof_index1][q][2];
941 const unsigned int shift_ij(
944 const unsigned int dof_index3_1(
945 cell_type3_offset1 + shift_ij);
946 const unsigned int dof_index3_2(
947 cell_type3_offset2 + shift_ij);
948 const unsigned int dof_index3_3(
949 cell_type3_offset3 + shift_ij);
951 data.shape_values[dof_index3_1][q][0] =
952 polyy[j][0] * polyz[k][0];
953 data.shape_values[dof_index3_1][q][1] = 0.0;
954 data.shape_values[dof_index3_1][q][2] = 0.0;
956 data.shape_values[dof_index3_2][q][0] = 0.0;
957 data.shape_values[dof_index3_2][q][1] =
958 polyx[j][0] * polyz[k][0];
959 data.shape_values[dof_index3_2][q][2] = 0.0;
961 data.shape_values[dof_index3_3][q][0] = 0.0;
962 data.shape_values[dof_index3_3][q][1] = 0.0;
963 data.shape_values[dof_index3_3][q][2] =
964 polyx[j][0] * polyy[k][0];
970 for (
unsigned int k = 0; k < degree; ++k)
972 const unsigned int shift_k(k * degree * degree);
973 const unsigned int shift_j(
976 for (
unsigned int j = 0; j < degree; ++j)
978 const unsigned int shift_jk(j * degree +
980 for (
unsigned int i = 0; i < degree; ++i)
982 const unsigned int shift_ijk(shift_jk +
986 const unsigned int dof_index1(
987 cell_type1_offset + shift_ijk);
989 data.shape_grads[dof_index1][q][0][0] =
990 4.0 * polyx[i][2] * polyy[j][0] *
992 data.shape_grads[dof_index1][q][0][1] =
993 4.0 * polyx[i][1] * polyy[j][1] *
995 data.shape_grads[dof_index1][q][0][2] =
996 4.0 * polyx[i][1] * polyy[j][0] *
999 data.shape_grads[dof_index1][q][1][0] =
1000 data.shape_grads[dof_index1][q][0][1];
1001 data.shape_grads[dof_index1][q][1][1] =
1002 4.0 * polyx[i][0] * polyy[j][2] *
1004 data.shape_grads[dof_index1][q][1][2] =
1005 4.0 * polyx[i][0] * polyy[j][1] *
1008 data.shape_grads[dof_index1][q][2][0] =
1009 data.shape_grads[dof_index1][q][0][2];
1010 data.shape_grads[dof_index1][q][2][1] =
1011 data.shape_grads[dof_index1][q][1][2];
1012 data.shape_grads[dof_index1][q][2][2] =
1013 4.0 * polyx[i][0] * polyy[j][0] *
1017 const unsigned int dof_index2_1(
1018 cell_type2_offset1 + shift_ijk);
1019 const unsigned int dof_index2_2(
1020 cell_type2_offset2 + shift_ijk);
1022 for (
unsigned int d = 0;
d < dim; ++
d)
1024 data.shape_grads[dof_index2_1][q][0]
1027 .shape_grads[dof_index1][q][0][
d];
1028 data.shape_grads[dof_index2_1][q][1]
1032 .shape_grads[dof_index1][q][1][
d];
1033 data.shape_grads[dof_index2_1][q][2]
1036 .shape_grads[dof_index1][q][2][
d];
1038 data.shape_grads[dof_index2_2][q][0]
1041 .shape_grads[dof_index1][q][0][
d];
1042 data.shape_grads[dof_index2_2][q][1]
1046 .shape_grads[dof_index1][q][1][
d];
1047 data.shape_grads[dof_index2_2][q][2]
1051 .shape_grads[dof_index1][q][2][
d];
1056 const unsigned int shift_ij(
1059 const unsigned int dof_index3_1(
1060 cell_type3_offset1 + shift_ij);
1061 const unsigned int dof_index3_2(
1062 cell_type3_offset2 + shift_ij);
1063 const unsigned int dof_index3_3(
1064 cell_type3_offset3 + shift_ij);
1065 for (
unsigned int d1 = 0; d1 < dim; ++d1)
1067 for (
unsigned int d2 = 0; d2 < dim; ++d2)
1069 data.shape_grads[dof_index3_1][q][d1]
1071 data.shape_grads[dof_index3_2][q][d1]
1073 data.shape_grads[dof_index3_3][q][d1]
1077 data.shape_grads[dof_index3_1][q][0][1] =
1078 2.0 * polyy[j][1] * polyz[k][0];
1079 data.shape_grads[dof_index3_1][q][0][2] =
1080 2.0 * polyy[j][0] * polyz[k][1];
1082 data.shape_grads[dof_index3_2][q][1][0] =
1083 2.0 * polyx[j][1] * polyz[k][0];
1084 data.shape_grads[dof_index3_2][q][1][2] =
1085 2.0 * polyx[j][0] * polyz[k][1];
1087 data.shape_grads[dof_index3_3][q][2][0] =
1088 2.0 * polyx[j][1] * polyy[k][0];
1089 data.shape_grads[dof_index3_3][q][2][1] =
1090 2.0 * polyx[j][0] * polyy[k][1];
1109template <
int dim,
int spacedim>
1130 const unsigned int n_q_points = quadrature.
size();
1133 fe_data.
shape_values.size() == this->n_dofs_per_cell(),
1135 this->n_dofs_per_cell()));
1141 const unsigned int degree(
1146 const unsigned int vertices_per_line(2);
1150 std::vector<std::vector<unsigned int>> edge_order(
1151 lines_per_cell, std::vector<unsigned int>(vertices_per_line));
1163 std::vector<int> edge_sign(lines_per_cell);
1164 for (
unsigned int m = 0; m < lines_per_cell; ++m)
1166 unsigned int v0_loc =
1168 unsigned int v1_loc =
1170 unsigned int v0_glob = cell->vertex_index(v0_loc);
1171 unsigned int v1_glob = cell->vertex_index(v1_loc);
1173 if (v0_glob > v1_glob)
1176 edge_sign[m] = -1.0;
1220 std::vector<std::vector<double>> edge_sigma_values(
1222 std::vector<std::vector<double>> edge_sigma_grads(
1225 std::vector<std::vector<double>> edge_lambda_values(
1227 std::vector<std::vector<double>> edge_lambda_grads(
1231 for (
unsigned int m = 0; m < lines_per_cell; ++m)
1234 edge_sigma_values[m].
end(),
1235 edge_sigma_values[m].
begin(),
1236 [&](
const double edge_sigma_value) {
1237 return edge_sign[m] * edge_sigma_value;
1241 edge_sigma_grads[m].
end(),
1242 edge_sigma_grads[m].
begin(),
1243 [&](
const double edge_sigma_grad) {
1244 return edge_sign[m] * edge_sigma_grad;
1254 for (
unsigned int m = 0; m < lines_per_cell; ++m)
1256 const unsigned int shift_m(m * this->n_dofs_per_line());
1257 for (
unsigned int q = 0; q < n_q_points; ++q)
1260 std::vector<std::vector<double>> poly(
1261 degree, std::vector<double>(poly_length));
1262 for (
unsigned int i = 1; i < degree + 1; ++i)
1267 IntegratedLegendrePolynomials[i + 1].value(
1268 edge_sigma_values[m][q], poly[i - 1]);
1273 for (
unsigned int d = 0;
d < dim; ++
d)
1276 0.5 * edge_sigma_grads[m][
d] *
1277 edge_lambda_values[m][q];
1280 for (
unsigned int i = 1; i < degree + 1; ++i)
1282 const unsigned int poly_index = i - 1;
1283 const unsigned int dof_index(i + shift_m);
1284 for (
unsigned int d = 0;
d < dim; ++
d)
1287 edge_sigma_grads[m][
d] *
1288 poly[poly_index][1] *
1289 edge_lambda_values[m][q] +
1290 poly[poly_index][0] *
1291 edge_lambda_grads[m][
d];
1298 for (
unsigned int d1 = 0; d1 < dim; ++d1)
1300 for (
unsigned int d2 = 0; d2 < dim; ++d2)
1305 0.5 * edge_sigma_grads[m][d1] *
1306 edge_lambda_grads[m][d2];
1310 for (
unsigned int i = 1; i < degree + 1; ++i)
1312 const unsigned int poly_index = i - 1;
1313 const unsigned int dof_index(i + shift_m);
1316 edge_sigma_grads[m][0] *
1317 edge_sigma_grads[m][0] *
1318 edge_lambda_values[m][q] * poly[poly_index][2];
1321 (edge_sigma_grads[m][0] *
1322 edge_lambda_grads[m][1] +
1323 edge_sigma_grads[m][1] *
1324 edge_lambda_grads[m][0]) *
1325 poly[poly_index][1];
1331 edge_sigma_grads[m][1] *
1332 edge_sigma_grads[m][1] *
1333 edge_lambda_values[m][q] * poly[poly_index][2];
1348 std::vector<int> edge_sign(lines_per_cell);
1349 for (
unsigned int m = 0; m < lines_per_cell; ++m)
1351 unsigned int v0_loc =
1353 unsigned int v1_loc =
1355 unsigned int v0_glob = cell->vertex_index(v0_loc);
1356 unsigned int v1_glob = cell->vertex_index(v1_loc);
1358 if (v0_glob > v1_glob)
1361 edge_sign[m] = -1.0;
1407 std::vector<std::vector<double>> edge_sigma_values(
1409 std::vector<std::vector<double>> edge_lambda_values(
1411 std::vector<std::vector<double>> edge_sigma_grads(
1413 std::vector<std::vector<std::vector<double>>> edge_lambda_grads(
1415 std::vector<std::vector<std::vector<double>>>
1419 for (
unsigned int m = 0; m < lines_per_cell; ++m)
1422 edge_sigma_values[m].
end(),
1423 edge_sigma_values[m].
begin(),
1424 [&](
const double edge_sigma_value) {
1425 return edge_sign[m] * edge_sigma_value;
1428 edge_sigma_grads[m].
end(),
1429 edge_sigma_grads[m].
begin(),
1430 [&](
const double edge_sigma_grad) {
1431 return edge_sign[m] * edge_sigma_grad;
1441 std::vector<std::vector<double>> poly(
1442 degree, std::vector<double>(poly_length));
1443 for (
unsigned int m = 0; m < lines_per_cell; ++m)
1445 const unsigned int shift_m(m * this->n_dofs_per_line());
1446 for (
unsigned int q = 0; q < n_q_points; ++q)
1451 for (
unsigned int i = 0; i < degree; ++i)
1453 IntegratedLegendrePolynomials[i + 2].value(
1454 edge_sigma_values[m][q], poly[i]);
1460 for (
unsigned int d = 0;
d < dim; ++
d)
1463 0.5 * edge_sigma_grads[m][
d] *
1464 edge_lambda_values[m][q];
1468 for (
unsigned int i = 0; i < degree; ++i)
1470 const unsigned int dof_index(i + 1 + shift_m);
1471 for (
unsigned int d = 0;
d < dim; ++
d)
1474 edge_sigma_grads[m][
d] * poly[i][1] *
1475 edge_lambda_values[m][q] +
1476 poly[i][0] * edge_lambda_grads[m][q][
d];
1484 for (
unsigned int d1 = 0; d1 < dim; ++d1)
1486 for (
unsigned int d2 = 0; d2 < dim; ++d2)
1489 0.5 * edge_sigma_grads[m][d1] *
1490 edge_lambda_grads[m][q][d2];
1495 for (
unsigned int i = 0; i < degree; ++i)
1497 const unsigned int dof_index(i + 1 + shift_m);
1499 for (
unsigned int d1 = 0; d1 < dim; ++d1)
1501 for (
unsigned int d2 = 0; d2 < dim; ++d2)
1505 edge_sigma_grads[m][d1] *
1506 edge_sigma_grads[m][d2] *
1508 edge_lambda_values[m][q] +
1509 (edge_sigma_grads[m][d1] *
1510 edge_lambda_grads[m][q][d2] +
1511 edge_sigma_grads[m][d2] *
1512 edge_lambda_grads[m][q][d1]) *
1514 edge_lambda_gradgrads_3d[m][d1]
1536template <
int dim,
int spacedim>
1556 const unsigned int degree(
1567 const unsigned int n_q_points = quadrature.
size();
1570 fe_data.
shape_values.size() == this->n_dofs_per_cell(),
1572 this->n_dofs_per_cell()));
1579 const unsigned int vertices_per_face(
1584 const unsigned int n_line_dofs =
1588 std::vector<std::vector<unsigned int>> face_orientation(
1589 faces_per_cell, std::vector<unsigned int>(vertices_per_face));
1599 {1, 2}, {0, 3}, {0, 3}, {1, 2}};
1601 for (
unsigned int m = 0; m < faces_per_cell; ++m)
1605 unsigned int current_max = 0;
1606 unsigned int current_glob = cell->vertex_index(
1608 for (
unsigned int v = 1; v < vertices_per_face; ++v)
1615 current_glob = cell->vertex_index(
1619 face_orientation[m][0] =
1624 m, vertex_opposite_on_face[current_max]);
1629 m, vertices_adjacent_on_face[current_max][0])) >
1631 m, vertices_adjacent_on_face[current_max][1])))
1633 face_orientation[m][1] =
1635 m, vertices_adjacent_on_face[current_max][0]);
1636 face_orientation[m][3] =
1638 m, vertices_adjacent_on_face[current_max][1]);
1642 face_orientation[m][1] =
1644 m, vertices_adjacent_on_face[current_max][1]);
1645 face_orientation[m][3] =
1647 m, vertices_adjacent_on_face[current_max][0]);
1653 std::vector<std::vector<double>> face_xi_values(
1654 faces_per_cell, std::vector<double>(n_q_points));
1655 std::vector<std::vector<double>> face_xi_grads(
1656 faces_per_cell, std::vector<double>(dim));
1657 std::vector<std::vector<double>> face_eta_values(
1658 faces_per_cell, std::vector<double>(n_q_points));
1659 std::vector<std::vector<double>> face_eta_grads(
1660 faces_per_cell, std::vector<double>(dim));
1662 std::vector<std::vector<double>> face_lambda_values(
1663 faces_per_cell, std::vector<double>(n_q_points));
1664 std::vector<std::vector<double>> face_lambda_grads(
1665 faces_per_cell, std::vector<double>(dim));
1666 for (
unsigned int m = 0; m < faces_per_cell; ++m)
1668 for (
unsigned int q = 0; q < n_q_points; ++q)
1670 face_xi_values[m][q] =
1672 [face_orientation[m][1]];
1673 face_eta_values[m][q] =
1675 [face_orientation[m][3]];
1678 for (
unsigned int d = 0;
d < dim; ++
d)
1680 face_xi_grads[m][
d] =
1682 [face_orientation[m][1]][
d];
1683 face_eta_grads[m][
d] =
1685 [face_orientation[m][3]][
d];
1692 std::vector<std::vector<double>> polyxi(
1693 degree, std::vector<double>(poly_length));
1694 std::vector<std::vector<double>> polyeta(
1695 degree, std::vector<double>(poly_length));
1698 for (
unsigned int m = 0; m < faces_per_cell; ++m)
1701 const unsigned int shift_m(m * this->n_dofs_per_quad(0));
1709 const unsigned int face_type1_offset(n_line_dofs + shift_m);
1719 const unsigned int face_type2_offset(face_type1_offset +
1731 const unsigned int face_type3_offset1(face_type2_offset +
1733 const unsigned int face_type3_offset2(face_type3_offset1 +
1737 for (
unsigned int q = 0; q < n_q_points; ++q)
1746 for (
unsigned int i = 0; i < degree; ++i)
1749 IntegratedLegendrePolynomials[i + 2].value(
1750 face_xi_values[m][q], polyxi[i]);
1751 IntegratedLegendrePolynomials[i + 2].value(
1752 face_eta_values[m][q], polyeta[i]);
1757 for (
unsigned int j = 0; j < degree; ++j)
1759 const unsigned int shift_j(j * degree);
1760 for (
unsigned int i = 0; i < degree; ++i)
1762 const unsigned int shift_ij(shift_j + i);
1764 const unsigned int dof_index1(face_type1_offset +
1766 for (
unsigned int d = 0;
d < dim; ++
d)
1769 (face_xi_grads[m][
d] * polyxi[i][1] *
1771 face_eta_grads[m][
d] * polyxi[i][0] *
1773 face_lambda_values[m][q] +
1774 face_lambda_grads[m][
d] * polyxi[i][0] *
1778 const unsigned int dof_index2(face_type2_offset +
1780 for (
unsigned int d = 0;
d < dim; ++
d)
1783 (face_xi_grads[m][
d] * polyxi[i][1] *
1785 face_eta_grads[m][
d] * polyxi[i][0] *
1787 face_lambda_values[m][q];
1791 const unsigned int dof_index3_1(face_type3_offset1 +
1793 const unsigned int dof_index3_2(face_type3_offset2 +
1795 for (
unsigned int d = 0;
d < dim; ++
d)
1798 face_xi_grads[m][
d] * polyeta[j][0] *
1799 face_lambda_values[m][q];
1802 face_eta_grads[m][
d] * polyxi[j][0] *
1803 face_lambda_values[m][q];
1809 for (
unsigned int j = 0; j < degree; ++j)
1811 const unsigned int shift_j(j * degree);
1812 for (
unsigned int i = 0; i < degree; ++i)
1814 const unsigned int shift_ij(shift_j + i);
1816 const unsigned int dof_index1(face_type1_offset +
1818 for (
unsigned int d1 = 0; d1 < dim; ++d1)
1820 for (
unsigned int d2 = 0; d2 < dim; ++d2)
1824 (face_xi_grads[m][d1] *
1825 face_xi_grads[m][d2] * polyxi[i][2] *
1827 (face_xi_grads[m][d1] *
1828 face_eta_grads[m][d2] +
1829 face_xi_grads[m][d2] *
1830 face_eta_grads[m][d1]) *
1831 polyxi[i][1] * polyeta[j][1] +
1832 face_eta_grads[m][d1] *
1833 face_eta_grads[m][d2] *
1834 polyxi[i][0] * polyeta[j][2]) *
1835 face_lambda_values[m][q] +
1836 (face_xi_grads[m][d2] * polyxi[i][1] *
1838 face_eta_grads[m][d2] * polyxi[i][0] *
1840 face_lambda_grads[m][d1] +
1841 (face_xi_grads[m][d1] * polyxi[i][1] *
1843 face_eta_grads[m][d1] * polyxi[i][0] *
1845 face_lambda_grads[m][d2];
1849 const unsigned int dof_index2(face_type2_offset +
1851 for (
unsigned int d1 = 0; d1 < dim; ++d1)
1853 for (
unsigned int d2 = 0; d2 < dim; ++d2)
1857 (face_xi_grads[m][d1] *
1858 face_xi_grads[m][d2] * polyxi[i][2] *
1860 (face_xi_grads[m][d1] *
1861 face_eta_grads[m][d2] -
1862 face_xi_grads[m][d2] *
1863 face_eta_grads[m][d1]) *
1864 polyxi[i][1] * polyeta[j][1] -
1865 face_eta_grads[m][d1] *
1866 face_eta_grads[m][d2] *
1867 polyxi[i][0] * polyeta[j][2]) *
1868 face_lambda_values[m][q] +
1869 (face_xi_grads[m][d1] * polyxi[i][1] *
1871 face_eta_grads[m][d1] * polyxi[i][0] *
1873 face_lambda_grads[m][d2];
1878 const unsigned int dof_index3_1(face_type3_offset1 +
1880 const unsigned int dof_index3_2(face_type3_offset2 +
1882 for (
unsigned int d1 = 0; d1 < dim; ++d1)
1884 for (
unsigned int d2 = 0; d2 < dim; ++d2)
1887 face_xi_grads[m][d1] *
1888 (face_eta_grads[m][d2] * polyeta[j][1] *
1889 face_lambda_values[m][q] +
1890 face_lambda_grads[m][d2] * polyeta[j][0]);
1893 face_eta_grads[m][d1] *
1894 (face_xi_grads[m][d2] * polyxi[j][1] *
1895 face_lambda_values[m][q] +
1896 face_lambda_grads[m][d2] * polyxi[j][0]);
1913template <
int dim,
int spacedim>
1921 const ::internal::FEValuesImplementation::MappingRelatedData<dim, dim>
1935 fill_edge_values(cell, quadrature, fe_data);
1936 if (dim == 3 && this->degree > 1)
1938 fill_face_values(cell, quadrature, fe_data);
1942 const unsigned int n_q_points = quadrature.
size();
1945 fe_data.
shape_values.size() == this->n_dofs_per_cell(),
1947 this->n_dofs_per_cell()));
1956 std::vector<Tensor<1, dim>> transformed_shape_values(n_q_points);
1957 for (
unsigned int dof = 0; dof < this->n_dofs_per_cell(); ++dof)
1959 const unsigned int first =
1961 this->get_nonzero_components(dof)
1962 .first_selected_component()];
1968 for (
unsigned int q = 0; q < n_q_points; ++q)
1970 for (
unsigned int d = 0;
d < dim; ++
d)
1973 transformed_shape_values[q][
d];
1982 std::vector<Tensor<2, dim>> input(n_q_points);
1983 std::vector<Tensor<2, dim>> transformed_shape_grads(n_q_points);
1984 for (
unsigned int dof = 0; dof < this->n_dofs_per_cell(); ++dof)
1986 for (
unsigned int q = 0; q < n_q_points; ++q)
1995 const unsigned int first =
1997 this->get_nonzero_components(dof)
1998 .first_selected_component()];
2000 for (
unsigned int q = 0; q < n_q_points; ++q)
2002 for (
unsigned int d1 = 0; d1 < dim; ++d1)
2004 for (
unsigned int d2 = 0; d2 < dim; ++d2)
2006 transformed_shape_grads[q][d1] -=
2008 mapping_data.jacobian_pushed_forward_grads[q][d2][d1];
2013 for (
unsigned int q = 0; q < n_q_points; ++q)
2015 for (
unsigned int d = 0;
d < dim; ++
d)
2018 transformed_shape_grads[q][
d];
2027template <
int dim,
int spacedim>
2031 const unsigned int face_no,
2035 const ::internal::FEValuesImplementation::MappingRelatedData<dim, dim>
2063 fill_edge_values(cell,
2067 if (dim == 3 && this->degree > 1)
2069 fill_face_values(cell,
2076 const unsigned int n_q_points = quadrature[0].
size();
2080 cell->face_orientation(face_no),
2081 cell->face_flip(face_no),
2082 cell->face_rotation(face_no),
2089 std::vector<Tensor<1, dim>> transformed_shape_values(n_q_points);
2090 for (
unsigned int dof = 0; dof < this->n_dofs_per_cell(); ++dof)
2099 const unsigned int first =
2101 this->get_nonzero_components(dof)
2102 .first_selected_component()];
2104 for (
unsigned int q = 0; q < n_q_points; ++q)
2106 for (
unsigned int d = 0;
d < dim; ++
d)
2109 transformed_shape_values[q][
d];
2118 std::vector<Tensor<2, dim>> input(n_q_points);
2119 std::vector<Tensor<2, dim>> transformed_shape_grads(n_q_points);
2120 for (
unsigned int dof = 0; dof < this->n_dofs_per_cell(); ++dof)
2122 for (
unsigned int q = 0; q < n_q_points; ++q)
2131 const unsigned int first =
2133 this->get_nonzero_components(dof)
2134 .first_selected_component()];
2136 for (
unsigned int q = 0; q < n_q_points; ++q)
2138 for (
unsigned int d1 = 0; d1 < dim; ++d1)
2140 for (
unsigned int d2 = 0; d2 < dim; ++d2)
2142 transformed_shape_grads[q][d1] -=
2144 mapping_data.jacobian_pushed_forward_grads[q][d2][d1];
2149 for (
unsigned int q = 0; q < n_q_points; ++q)
2151 for (
unsigned int d = 0;
d < dim; ++
d)
2154 transformed_shape_grads[q][
d];
2163template <
int dim,
int spacedim>
2167 const unsigned int ,
2168 const unsigned int ,
2172 const ::internal::FEValuesImplementation::MappingRelatedData<dim, dim>
2183template <
int dim,
int spacedim>
2210template <
int dim,
int spacedim>
2216 std::ostringstream namebuf;
2217 namebuf <<
"FE_NedelecSZ<" << dim <<
">(" << this->degree - 1 <<
")";
2219 return namebuf.str();
2224template <
int dim,
int spacedim>
2225std::unique_ptr<FiniteElement<dim, dim>>
2228 return std::make_unique<FE_NedelecSZ<dim, spacedim>>(*this);
2233template <
int dim,
int spacedim>
2234std::vector<unsigned int>
2243 std::vector<unsigned int> dpo;
2246 dpo.push_back(degree + 1);
2248 dpo.push_back(2 * degree * (degree + 1));
2250 dpo.push_back(3 * degree * degree * (degree + 1));
2257template <
int dim,
int spacedim>
2266 return 2 * (degree + 1) * (degree + 2);
2269 return 3 * (degree + 1) * (degree + 2) * (degree + 2);
2281template <
int dim,
int spacedim>
2286 IntegratedLegendrePolynomials =
2293#include "fe_nedelec_sz.inst"
ArrayView< typename std::remove_reference< typename std::iterator_traits< Iterator >::reference >::type, MemorySpaceType > make_array_view(const Iterator begin, const Iterator end)
std::vector< std::vector< double > > edge_lambda_grads_2d
std::vector< std::vector< Tensor< 1, dim > > > shape_values
std::vector< std::vector< std::vector< double > > > sigma_imj_values
std::vector< std::vector< double > > edge_sigma_grads
std::vector< std::vector< double > > edge_sigma_values
std::vector< std::vector< std::vector< double > > > sigma_imj_grads
std::vector< std::vector< double > > face_lambda_values
std::vector< std::vector< DerivativeForm< 1, dim, dim > > > shape_grads
std::vector< std::vector< std::vector< double > > > edge_lambda_grads_3d
std::vector< std::vector< double > > edge_lambda_values
std::vector< std::vector< std::vector< double > > > edge_lambda_gradgrads_3d
std::vector< std::vector< double > > face_lambda_grads
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
unsigned int compute_num_dofs(const unsigned int degree) const
virtual std::unique_ptr< FiniteElement< dim, dim > > clone() const override
virtual void fill_fe_face_values(const typename Triangulation< dim, dim >::cell_iterator &cell, const unsigned int face_no, const hp::QCollection< 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
FE_NedelecSZ(const unsigned int order)
virtual UpdateFlags requires_update_flags(const UpdateFlags update_flags) const override
static std::vector< unsigned int > get_dpo_vector(const unsigned int degree)
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
void create_polynomials(const unsigned int degree)
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
virtual std::string get_name() const override
virtual Tensor< 2, dim > shape_grad_grad_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
virtual Tensor< 1, dim > shape_grad_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
virtual Tensor< 1, dim > shape_grad(const unsigned int i, const Point< dim > &p) const override
virtual Tensor< 2, dim > shape_grad_grad(const unsigned int i, const Point< dim > &p) const override
virtual double shape_value_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
void fill_face_values(const typename Triangulation< dim, dim >::cell_iterator &cell, const Quadrature< dim > &quadrature, const InternalData &fedata) const
void fill_edge_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
unsigned int n_components() const
std::vector< std::pair< std::pair< unsigned int, unsigned int >, unsigned int > > component_to_base_table
static std::vector< Polynomials::Polynomial< double > > generate_complete_basis(const unsigned int degree)
virtual void transform(const ArrayView< const Tensor< 1, dim > > &input, const MappingKind kind, const typename Mapping< dim, spacedim >::InternalDataBase &internal, const ArrayView< Tensor< 1, spacedim > > &output) const =0
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)
const std::vector< Point< dim > > & get_points() const
unsigned int size() const
unsigned int size() const
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
@ update_jacobian_pushed_forward_2nd_derivatives
@ update_jacobian_pushed_forward_grads
@ update_hessians
Second derivatives of shape functions.
@ update_values
Shape function values.
@ update_covariant_transformation
Covariant transformation.
@ update_gradients
Shape function gradients.
@ update_default
No update.
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
static ::ExceptionBase & ExcImpossibleInDim(int arg1)
#define AssertDimension(dim1, dim2)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
@ mapping_covariant_gradient
std::vector< unsigned int > get_dpo_vector(const unsigned int degree)
void reference_cell(Triangulation< dim, spacedim > &tria, const ReferenceCell &reference_cell)
SymmetricTensor< 2, dim, Number > d(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
VectorType::value_type * end(VectorType &V)
VectorType::value_type * begin(VectorType &V)
void transform(const InputIterator &begin_in, const InputIterator &end_in, OutputIterator out, const Predicate &predicate, const unsigned int grainsize)
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)
static unsigned int line_to_cell_vertices(const unsigned int line, const unsigned int vertex)