17 #include <deal.II/base/derivative_form.h> 18 #include <deal.II/base/qprojector.h> 19 #include <deal.II/base/polynomials_bdm.h> 20 #include <deal.II/base/polynomials_raviart_thomas.h> 21 #include <deal.II/base/polynomials_abf.h> 22 #include <deal.II/base/polynomials_nedelec.h> 23 #include <deal.II/fe/fe_poly_tensor.h> 24 #include <deal.II/fe/fe_values.h> 25 #include <deal.II/fe/mapping_cartesian.h> 27 DEAL_II_NAMESPACE_OPEN
45 std::vector<double> &face_sign)
48 std::fill (face_sign.begin (), face_sign.end (), 1.0);
55 const unsigned int dofs_per_face,
56 std::vector<double> &face_sign)
58 const unsigned int dim = 2;
59 const unsigned int spacedim = 2;
63 std::fill (face_sign.begin (), face_sign.end (), 1.0);
66 f < GeometryInfo<dim>::faces_per_cell; ++f)
69 if (!face->at_boundary ())
71 const unsigned int nn = cell->neighbor_face_no(f);
74 for (
unsigned int j = 0; j < dofs_per_face; ++j)
76 Assert (f * dofs_per_face + j < face_sign.size(),
80 face_sign[f * dofs_per_face + j] = -1.0;
91 std::vector<double> &face_sign)
93 std::fill (face_sign.begin (), face_sign.end (), 1.0);
100 std::vector<double> &face_sign)
103 std::fill (face_sign.begin (), face_sign.end (), 1.0);
111 std::vector<double> &face_sign)
113 std::fill (face_sign.begin (), face_sign.end (), 1.0);
121 std::vector<double> &face_sign)
123 const unsigned int dim = 3;
124 std::fill (face_sign.begin (), face_sign.end (), 1.0);
126 for (
unsigned int l = 0; l < GeometryInfo<dim>::lines_per_cell; ++l)
127 if (!(cell->line_orientation (l)))
134 template <
class PolynomialType,
int dim,
int spacedim>
136 (
const unsigned int degree,
138 const std::vector<bool> &restriction_is_additive_flags,
139 const std::vector<ComponentMask> &nonzero_components)
142 restriction_is_additive_flags,
144 poly_space(PolynomialType(degree))
146 cached_point(0) = -1;
154 for (
unsigned int comp=0; comp<this->
n_components() ; ++comp)
155 this->component_to_base_table[comp].first.second = comp;
160 template <
class PolynomialType,
int dim,
int spacedim>
167 Assert(
false,
typename FEE::ExcFENotPrimitive());
173 template <
class PolynomialType,
int dim,
int spacedim>
176 (
const unsigned int i,
178 const unsigned int component)
const 180 Assert (i<this->dofs_per_cell, ExcIndexRange(i,0,this->dofs_per_cell));
181 Assert (component < dim, ExcIndexRange (component, 0, dim));
183 if (cached_point != p || cached_values.size() == 0)
186 cached_values.resize(poly_space.n());
188 std::vector<Tensor<4,dim> > dummy1;
189 std::vector<Tensor<5,dim> > dummy2;
190 poly_space.compute(p, cached_values, cached_grads, cached_grad_grads, dummy1, dummy2);
194 if (inverse_node_matrix.n_cols() == 0)
195 return cached_values[i][component];
197 for (
unsigned int j=0; j<inverse_node_matrix.n_cols(); ++j)
198 s += inverse_node_matrix(j,i) * cached_values[j][component];
204 template <
class PolynomialType,
int dim,
int spacedim>
210 Assert(
false,
typename FEE::ExcFENotPrimitive());
216 template <
class PolynomialType,
int dim,
int spacedim>
219 (
const unsigned int i,
221 const unsigned int component)
const 223 Assert (i<this->dofs_per_cell, ExcIndexRange(i,0,this->dofs_per_cell));
224 Assert (component < dim, ExcIndexRange (component, 0, dim));
226 if (cached_point != p || cached_grads.size() == 0)
229 cached_grads.resize(poly_space.n());
231 std::vector<Tensor<4,dim> > dummy1;
232 std::vector<Tensor<5,dim> > dummy2;
233 poly_space.compute(p, cached_values, cached_grads, cached_grad_grads, dummy1, dummy2);
237 if (inverse_node_matrix.n_cols() == 0)
238 return cached_grads[i][component];
240 for (
unsigned int j=0; j<inverse_node_matrix.n_cols(); ++j)
241 s += inverse_node_matrix(j,i) * cached_grads[j][component];
248 template <
class PolynomialType,
int dim,
int spacedim>
255 Assert(
false,
typename FEE::ExcFENotPrimitive());
261 template <
class PolynomialType,
int dim,
int spacedim>
264 (
const unsigned int i,
266 const unsigned int component)
const 268 Assert (i<this->dofs_per_cell, ExcIndexRange(i,0,this->dofs_per_cell));
269 Assert (component < dim, ExcIndexRange (component, 0, dim));
271 if (cached_point != p || cached_grad_grads.size() == 0)
274 cached_grad_grads.resize(poly_space.n());
276 std::vector<Tensor<4,dim> > dummy1;
277 std::vector<Tensor<5,dim> > dummy2;
278 poly_space.compute(p, cached_values, cached_grads, cached_grad_grads, dummy1, dummy2);
282 if (inverse_node_matrix.n_cols() == 0)
283 return cached_grad_grads[i][component];
285 for (
unsigned int j=0; j<inverse_node_matrix.n_cols(); ++j)
286 s += inverse_node_matrix(i,j) * cached_grad_grads[j][component];
296 template <
class PolynomialType,
int dim,
int spacedim>
301 const CellSimilarity::Similarity cell_similarity,
305 const ::internal::FEValues::MappingRelatedData<dim, spacedim> &mapping_data,
313 Assert (dynamic_cast<const InternalData *> (&fe_internal) != 0,
315 const InternalData &fe_data =
static_cast<const InternalData &
> (fe_internal);
317 const unsigned int n_q_points = quadrature.
size();
319 Assert(!(fe_data.update_each &
update_values) || fe_data.shape_values.size()[0] == this->dofs_per_cell,
320 ExcDimensionMismatch(fe_data.shape_values.size()[0], this->dofs_per_cell));
321 Assert(!(fe_data.update_each &
update_values) || fe_data.shape_values.size()[1] == n_q_points,
322 ExcDimensionMismatch(fe_data.shape_values.size()[1], n_q_points));
329 std::fill( fe_data.sign_change.begin(), fe_data.sign_change.end(), 1.0 );
332 get_face_sign_change_rt (cell, this->dofs_per_face, fe_data.sign_change);
334 get_face_sign_change_nedelec (cell, this->dofs_per_face, fe_data.sign_change);
337 for (
unsigned int i=0; i<this->dofs_per_cell; ++i)
340 this->get_nonzero_components(i).first_selected_component()];
349 ((cell_similarity != CellSimilarity::translation)
354 switch (mapping_type)
358 for (
unsigned int k=0; k<n_q_points; ++k)
359 for (
unsigned int d=0; d<dim; ++d)
360 output_data.
shape_values(first+d,k) = fe_data.shape_values[i][k][d];
372 for (
unsigned int k=0; k<n_q_points; ++k)
373 for (
unsigned int d=0; d<dim; ++d)
374 output_data.
shape_values(first+d,k) = fe_data.transformed_shape_values[k][d];
386 for (
unsigned int k=0; k<n_q_points; ++k)
387 for (
unsigned int d=0; d<dim; ++d)
389 = fe_data.sign_change[i] * fe_data.transformed_shape_values[k][d];
400 for (
unsigned int k = 0; k < n_q_points; ++k)
401 for (
unsigned int d = 0; d < dim; ++d)
402 output_data.
shape_values(first+d,k) = fe_data.sign_change[i]
403 * fe_data.transformed_shape_values[k][d];
409 Assert(
false, ExcNotImplemented());
416 ((cell_similarity != CellSimilarity::translation)
422 switch (mapping_type)
430 for (
unsigned int k=0; k<n_q_points; ++k)
431 for (
unsigned int d=0; d<dim; ++d)
432 output_data.
shape_gradients[first+d][k] = fe_data.transformed_shape_grads[k][d];
442 for (
unsigned int k=0; k<n_q_points; ++k)
443 for (
unsigned int d=0; d<spacedim; ++d)
444 for (
unsigned int n=0; n<spacedim; ++n)
445 fe_data.transformed_shape_grads[k][d] -= output_data.
shape_values(first+n,k)
446 * mapping_data.jacobian_pushed_forward_grads[k][n][d];
448 for (
unsigned int k=0; k<n_q_points; ++k)
449 for (
unsigned int d=0; d<dim; ++d)
450 output_data.
shape_gradients[first+d][k] = fe_data.transformed_shape_grads[k][d];
456 for (
unsigned int k=0; k<n_q_points; ++k)
457 fe_data.untransformed_shape_grads[k] = fe_data.shape_grads[i][k];
463 for (
unsigned int k=0; k<n_q_points; ++k)
464 for (
unsigned int d=0; d<spacedim; ++d)
465 for (
unsigned int n=0; n<spacedim; ++n)
466 fe_data.transformed_shape_grads[k][d] += output_data.
shape_values(first+n,k)
467 * mapping_data.jacobian_pushed_forward_grads[k][d][n];
470 for (
unsigned int k=0; k<n_q_points; ++k)
471 for (
unsigned int d=0; d<dim; ++d)
472 output_data.
shape_gradients[first+d][k] = fe_data.transformed_shape_grads[k][d];
479 for (
unsigned int k=0; k<n_q_points; ++k)
480 fe_data.untransformed_shape_grads[k] = fe_data.shape_grads[i][k];
486 for (
unsigned int k=0; k<n_q_points; ++k)
487 for (
unsigned int d=0; d<spacedim; ++d)
488 for (
unsigned int n=0; n<spacedim; ++n)
489 fe_data.transformed_shape_grads[k][d] += ( output_data.
shape_values(first+n,k)
490 * mapping_data.jacobian_pushed_forward_grads[k][d][n] )
492 * mapping_data.jacobian_pushed_forward_grads[k][n][n] );
494 for (
unsigned int k=0; k<n_q_points; ++k)
495 for (
unsigned int d=0; d<dim; ++d)
497 * fe_data.transformed_shape_grads[k][d];
514 for (
unsigned int k=0; k<n_q_points; ++k)
515 fe_data.untransformed_shape_grads[k] = fe_data.shape_grads[i][k];
522 for (
unsigned int k=0; k<n_q_points; ++k)
523 for (
unsigned int d=0; d<spacedim; ++d)
524 for (
unsigned int n=0; n<spacedim; ++n)
525 fe_data.transformed_shape_grads[k][d] -= output_data.
shape_values(first+n,k)
526 * mapping_data.jacobian_pushed_forward_grads[k][n][d];
528 for (
unsigned int k = 0; k < n_q_points; ++k)
529 for (
unsigned int d = 0; d < dim; ++d)
531 * fe_data.transformed_shape_grads[k][d];
537 Assert(
false, ExcNotImplemented());
544 ((cell_similarity != CellSimilarity::translation)
551 switch (mapping_type)
561 for (
unsigned int k=0; k<n_q_points; ++k)
562 for (
unsigned int d=0; d<spacedim; ++d)
563 for (
unsigned int n=0; n<spacedim; ++n)
564 fe_data.transformed_shape_hessians[k][d] -= output_data.
shape_gradients[first+d][k][n]
565 * mapping_data.jacobian_pushed_forward_grads[k][n];
567 for (
unsigned int k=0; k<n_q_points; ++k)
568 for (
unsigned int d=0; d<dim; ++d)
569 output_data.
shape_hessians[first+d][k] = fe_data.transformed_shape_hessians[k][d];
577 for (
unsigned int k=0; k<n_q_points; ++k)
578 fe_data.untransformed_shape_hessian_tensors[k] = fe_data.shape_grad_grads[i][k];
584 for (
unsigned int k=0; k<n_q_points; ++k)
585 for (
unsigned int d=0; d<spacedim; ++d)
586 for (
unsigned int n=0; n<spacedim; ++n)
587 for (
unsigned int i=0; i<spacedim; ++i)
588 for (
unsigned int j=0; j<spacedim; ++j)
590 fe_data.transformed_shape_hessians[k][d][i][j]
592 * mapping_data.jacobian_pushed_forward_2nd_derivatives[k][n][d][i][j])
594 * mapping_data.jacobian_pushed_forward_grads[k][n][i][j])
596 * mapping_data.jacobian_pushed_forward_grads[k][n][d][j])
598 * mapping_data.jacobian_pushed_forward_grads[k][n][i][d]);
601 for (
unsigned int k=0; k<n_q_points; ++k)
602 for (
unsigned int d=0; d<dim; ++d)
603 output_data.
shape_hessians[first+d][k] = fe_data.transformed_shape_hessians[k][d];
611 for (
unsigned int k=0; k<n_q_points; ++k)
612 fe_data.untransformed_shape_hessian_tensors[k] = fe_data.shape_grad_grads[i][k];
619 for (
unsigned int k=0; k<n_q_points; ++k)
620 for (
unsigned int d=0; d<spacedim; ++d)
621 for (
unsigned int n=0; n<spacedim; ++n)
622 for (
unsigned int i=0; i<spacedim; ++i)
623 for (
unsigned int j=0; j<spacedim; ++j)
625 fe_data.transformed_shape_hessians[k][d][i][j]
627 * mapping_data.jacobian_pushed_forward_2nd_derivatives[k][d][n][i][j])
629 * mapping_data.jacobian_pushed_forward_grads[k][d][n][j])
631 * mapping_data.jacobian_pushed_forward_grads[k][d][i][n])
633 * mapping_data.jacobian_pushed_forward_grads[k][n][i][j]);
634 for (
unsigned int m=0; m<spacedim; ++m)
635 fe_data.transformed_shape_hessians[k][d][i][j]
636 -= (mapping_data.jacobian_pushed_forward_grads[k][d][i][m]
637 * mapping_data.jacobian_pushed_forward_grads[k][m][n][j]
639 + (mapping_data.jacobian_pushed_forward_grads[k][d][m][j]
640 * mapping_data.jacobian_pushed_forward_grads[k][m][i][n]
644 for (
unsigned int k=0; k<n_q_points; ++k)
645 for (
unsigned int d=0; d<dim; ++d)
646 output_data.
shape_hessians[first+d][k] = fe_data.transformed_shape_hessians[k][d];
655 for (
unsigned int k=0; k<n_q_points; ++k)
656 fe_data.untransformed_shape_hessian_tensors[k] = fe_data.shape_grad_grads[i][k];
663 for (
unsigned int k=0; k<n_q_points; ++k)
664 for (
unsigned int d=0; d<spacedim; ++d)
665 for (
unsigned int n=0; n<spacedim; ++n)
666 for (
unsigned int i=0; i<spacedim; ++i)
667 for (
unsigned int j=0; j<spacedim; ++j)
669 fe_data.transformed_shape_hessians[k][d][i][j]
671 * mapping_data.jacobian_pushed_forward_2nd_derivatives[k][d][n][i][j])
673 * mapping_data.jacobian_pushed_forward_grads[k][d][n][j])
675 * mapping_data.jacobian_pushed_forward_grads[k][d][i][n])
677 * mapping_data.jacobian_pushed_forward_grads[k][n][i][j]);
679 fe_data.transformed_shape_hessians[k][d][i][j]
681 * mapping_data.jacobian_pushed_forward_2nd_derivatives[k][n][n][i][j])
683 * mapping_data.jacobian_pushed_forward_grads[k][n][n][j])
685 * mapping_data.jacobian_pushed_forward_grads[k][n][n][i]);
687 for (
unsigned int m=0; m<spacedim; ++m)
689 fe_data.transformed_shape_hessians[k][d][i][j]
690 -= (mapping_data.jacobian_pushed_forward_grads[k][d][i][m]
691 * mapping_data.jacobian_pushed_forward_grads[k][m][n][j]
693 + (mapping_data.jacobian_pushed_forward_grads[k][d][m][j]
694 * mapping_data.jacobian_pushed_forward_grads[k][m][i][n]
697 fe_data.transformed_shape_hessians[k][d][i][j]
698 += (mapping_data.jacobian_pushed_forward_grads[k][n][i][m]
699 * mapping_data.jacobian_pushed_forward_grads[k][m][n][j]
701 + (mapping_data.jacobian_pushed_forward_grads[k][n][m][j]
702 * mapping_data.jacobian_pushed_forward_grads[k][m][i][n]
707 for (
unsigned int k=0; k<n_q_points; ++k)
708 for (
unsigned int d=0; d<dim; ++d)
709 output_data.
shape_hessians[first+d][k] = fe_data.sign_change[i] * fe_data.transformed_shape_hessians[k][d];
718 for (
unsigned int k=0; k<n_q_points; ++k)
719 fe_data.untransformed_shape_hessian_tensors[k] = fe_data.shape_grad_grads[i][k];
725 for (
unsigned int k=0; k<n_q_points; ++k)
726 for (
unsigned int d=0; d<spacedim; ++d)
727 for (
unsigned int n=0; n<spacedim; ++n)
728 for (
unsigned int i=0; i<spacedim; ++i)
729 for (
unsigned int j=0; j<spacedim; ++j)
731 fe_data.transformed_shape_hessians[k][d][i][j]
733 * mapping_data.jacobian_pushed_forward_2nd_derivatives[k][n][d][i][j])
735 * mapping_data.jacobian_pushed_forward_grads[k][n][i][j])
737 * mapping_data.jacobian_pushed_forward_grads[k][n][d][j])
739 * mapping_data.jacobian_pushed_forward_grads[k][n][i][d]);
742 for (
unsigned int k=0; k<n_q_points; ++k)
743 for (
unsigned int d=0; d<dim; ++d)
744 output_data.
shape_hessians[first+d][k] = fe_data.sign_change[i] * fe_data.transformed_shape_hessians[k][d];
751 Assert(
false, ExcNotImplemented());
758 ((cell_similarity != CellSimilarity::translation)
763 Assert(
false, ExcNotImplemented())
770 template <
class PolynomialType,
int dim,
int spacedim>
775 const unsigned int face_no,
779 const ::internal::FEValues::MappingRelatedData<dim, spacedim> &mapping_data,
787 Assert (dynamic_cast<const InternalData *> (&fe_internal) != 0,
789 const InternalData &fe_data =
static_cast<const InternalData &
> (fe_internal);
791 const unsigned int n_q_points = quadrature.
size();
798 cell->face_orientation(face_no),
799 cell->face_flip(face_no),
800 cell->face_rotation(face_no),
810 std::fill( fe_data.sign_change.begin(), fe_data.sign_change.end(), 1.0 );
813 get_face_sign_change_rt (cell, this->dofs_per_face, fe_data.sign_change);
816 get_face_sign_change_nedelec (cell, this->dofs_per_face, fe_data.sign_change);
818 for (
unsigned int i=0; i<this->dofs_per_cell; ++i)
821 this->get_nonzero_components(i).first_selected_component()];
825 switch (mapping_type)
829 for (
unsigned int k=0; k<n_q_points; ++k)
830 for (
unsigned int d=0; d<dim; ++d)
831 output_data.
shape_values(first+d,k) = fe_data.shape_values[i][k+offset][d];
839 =
make_array_view(fe_data.transformed_shape_values, offset, n_q_points);
843 transformed_shape_values);
845 for (
unsigned int k=0; k<n_q_points; ++k)
846 for (
unsigned int d=0; d<dim; ++d)
847 output_data.
shape_values(first+d,k) = transformed_shape_values[k][d];
855 =
make_array_view(fe_data.transformed_shape_values, offset, n_q_points);
859 transformed_shape_values);
860 for (
unsigned int k=0; k<n_q_points; ++k)
861 for (
unsigned int d=0; d<dim; ++d)
863 = fe_data.sign_change[i] * transformed_shape_values[k][d];
870 =
make_array_view(fe_data.transformed_shape_values, offset, n_q_points);
874 transformed_shape_values);
876 for (
unsigned int k = 0; k < n_q_points; ++k)
877 for (
unsigned int d = 0; d < dim; ++d)
879 fe_data.sign_change[i] * transformed_shape_values[k][d];
885 Assert(
false, ExcNotImplemented());
891 switch (mapping_type)
896 =
make_array_view(fe_data.transformed_shape_grads, offset, n_q_points);
900 transformed_shape_grads);
901 for (
unsigned int k=0; k<n_q_points; ++k)
902 for (
unsigned int d=0; d<dim; ++d)
903 output_data.
shape_gradients[first+d][k] = transformed_shape_grads[k][d];
910 =
make_array_view(fe_data.transformed_shape_grads, offset, n_q_points);
914 transformed_shape_grads);
916 for (
unsigned int k=0; k<n_q_points; ++k)
917 for (
unsigned int d=0; d<spacedim; ++d)
918 for (
unsigned int n=0; n<spacedim; ++n)
919 transformed_shape_grads[k][d] -= output_data.
shape_values(first+n,k)
920 * mapping_data.jacobian_pushed_forward_grads[k][n][d];
922 for (
unsigned int k=0; k<n_q_points; ++k)
923 for (
unsigned int d=0; d<dim; ++d)
924 output_data.
shape_gradients[first+d][k] = transformed_shape_grads[k][d];
931 =
make_array_view(fe_data.transformed_shape_grads, offset, n_q_points);
932 for (
unsigned int k=0; k<n_q_points; ++k)
933 fe_data.untransformed_shape_grads[k+offset] = fe_data.shape_grads[i][k+offset];
937 transformed_shape_grads);
939 for (
unsigned int k=0; k<n_q_points; ++k)
940 for (
unsigned int d=0; d<spacedim; ++d)
941 for (
unsigned int n=0; n<spacedim; ++n)
942 transformed_shape_grads[k][d] += output_data.
shape_values(first+n,k)
943 * mapping_data.jacobian_pushed_forward_grads[k][d][n];
945 for (
unsigned int k=0; k<n_q_points; ++k)
946 for (
unsigned int d=0; d<dim; ++d)
947 output_data.
shape_gradients[first+d][k] = transformed_shape_grads[k][d];
956 =
make_array_view(fe_data.transformed_shape_grads, offset, n_q_points);
957 for (
unsigned int k=0; k<n_q_points; ++k)
958 fe_data.untransformed_shape_grads[k+offset] = fe_data.shape_grads[i][k+offset];
962 transformed_shape_grads);
964 for (
unsigned int k=0; k<n_q_points; ++k)
965 for (
unsigned int d=0; d<spacedim; ++d)
966 for (
unsigned int n=0; n<spacedim; ++n)
967 transformed_shape_grads[k][d] += ( output_data.
shape_values(first+n,k)
968 * mapping_data.jacobian_pushed_forward_grads[k][d][n] )
971 * mapping_data.jacobian_pushed_forward_grads[k][n][n] );
973 for (
unsigned int k = 0; k < n_q_points; ++k)
974 for (
unsigned int d = 0; d < dim; ++d)
976 * transformed_shape_grads[k][d];
993 for (
unsigned int k=0; k<n_q_points; ++k)
994 fe_data.untransformed_shape_grads[k+offset] = fe_data.shape_grads[i][k+offset];
997 =
make_array_view(fe_data.transformed_shape_grads, offset, n_q_points);
1001 transformed_shape_grads);
1003 for (
unsigned int k=0; k<n_q_points; ++k)
1004 for (
unsigned int d=0; d<spacedim; ++d)
1005 for (
unsigned int n=0; n<spacedim; ++n)
1006 transformed_shape_grads[k][d] -= output_data.
shape_values(first+n,k)
1007 * mapping_data.jacobian_pushed_forward_grads[k][n][d];
1009 for (
unsigned int k = 0; k < n_q_points; ++k)
1010 for (
unsigned int d = 0; d < dim; ++d)
1012 * transformed_shape_grads[k][d];
1018 Assert(
false, ExcNotImplemented());
1024 switch (mapping_type)
1029 =
make_array_view(fe_data.transformed_shape_hessians, offset, n_q_points);
1033 transformed_shape_hessians);
1035 for (
unsigned int k=0; k<n_q_points; ++k)
1036 for (
unsigned int d=0; d<spacedim; ++d)
1037 for (
unsigned int n=0; n<spacedim; ++n)
1038 transformed_shape_hessians[k][d] -= output_data.
shape_gradients[first+d][k][n]
1039 *mapping_data.jacobian_pushed_forward_grads[k][n];
1041 for (
unsigned int k=0; k<n_q_points; ++k)
1042 for (
unsigned int d=0; d<dim; ++d)
1043 output_data.
shape_hessians[first+d][k] = transformed_shape_hessians[k][d];
1050 for (
unsigned int k=0; k<n_q_points; ++k)
1051 fe_data.untransformed_shape_hessian_tensors[k+offset] = fe_data.shape_grad_grads[i][k+offset];
1054 =
make_array_view(fe_data.transformed_shape_hessians, offset, n_q_points);
1058 transformed_shape_hessians);
1060 for (
unsigned int k=0; k<n_q_points; ++k)
1061 for (
unsigned int d=0; d<spacedim; ++d)
1062 for (
unsigned int n=0; n<spacedim; ++n)
1063 for (
unsigned int i=0; i<spacedim; ++i)
1064 for (
unsigned int j=0; j<spacedim; ++j)
1066 transformed_shape_hessians[k][d][i][j]
1068 * mapping_data.jacobian_pushed_forward_2nd_derivatives[k][n][d][i][j])
1070 * mapping_data.jacobian_pushed_forward_grads[k][n][i][j])
1072 * mapping_data.jacobian_pushed_forward_grads[k][n][d][j])
1074 * mapping_data.jacobian_pushed_forward_grads[k][n][i][d]);
1077 for (
unsigned int k=0; k<n_q_points; ++k)
1078 for (
unsigned int d=0; d<dim; ++d)
1079 output_data.
shape_hessians[first+d][k] = transformed_shape_hessians[k][d];
1087 for (
unsigned int k=0; k<n_q_points; ++k)
1088 fe_data.untransformed_shape_hessian_tensors[k+offset] = fe_data.shape_grad_grads[i][k+offset];
1091 =
make_array_view(fe_data.transformed_shape_hessians, offset, n_q_points);
1095 transformed_shape_hessians);
1097 for (
unsigned int k=0; k<n_q_points; ++k)
1098 for (
unsigned int d=0; d<spacedim; ++d)
1099 for (
unsigned int n=0; n<spacedim; ++n)
1100 for (
unsigned int i=0; i<spacedim; ++i)
1101 for (
unsigned int j=0; j<spacedim; ++j)
1103 transformed_shape_hessians[k][d][i][j]
1105 * mapping_data.jacobian_pushed_forward_2nd_derivatives[k][d][n][i][j])
1107 * mapping_data.jacobian_pushed_forward_grads[k][d][n][j])
1109 * mapping_data.jacobian_pushed_forward_grads[k][d][i][n])
1111 * mapping_data.jacobian_pushed_forward_grads[k][n][i][j]);
1112 for (
unsigned int m=0; m<spacedim; ++m)
1113 transformed_shape_hessians[k][d][i][j]
1114 -= (mapping_data.jacobian_pushed_forward_grads[k][d][i][m]
1115 * mapping_data.jacobian_pushed_forward_grads[k][m][n][j]
1117 + (mapping_data.jacobian_pushed_forward_grads[k][d][m][j]
1118 * mapping_data.jacobian_pushed_forward_grads[k][m][i][n]
1122 for (
unsigned int k=0; k<n_q_points; ++k)
1123 for (
unsigned int d=0; d<dim; ++d)
1124 output_data.
shape_hessians[first+d][k] = transformed_shape_hessians[k][d];
1132 for (
unsigned int k=0; k<n_q_points; ++k)
1133 fe_data.untransformed_shape_hessian_tensors[k+offset] = fe_data.shape_grad_grads[i][k+offset];
1136 =
make_array_view(fe_data.transformed_shape_hessians, offset, n_q_points);
1140 transformed_shape_hessians);
1142 for (
unsigned int k=0; k<n_q_points; ++k)
1143 for (
unsigned int d=0; d<spacedim; ++d)
1144 for (
unsigned int n=0; n<spacedim; ++n)
1145 for (
unsigned int i=0; i<spacedim; ++i)
1146 for (
unsigned int j=0; j<spacedim; ++j)
1148 transformed_shape_hessians[k][d][i][j]
1150 * mapping_data.jacobian_pushed_forward_2nd_derivatives[k][d][n][i][j])
1152 * mapping_data.jacobian_pushed_forward_grads[k][d][n][j])
1154 * mapping_data.jacobian_pushed_forward_grads[k][d][i][n])
1156 * mapping_data.jacobian_pushed_forward_grads[k][n][i][j]);
1158 transformed_shape_hessians[k][d][i][j]
1160 * mapping_data.jacobian_pushed_forward_2nd_derivatives[k][n][n][i][j])
1162 * mapping_data.jacobian_pushed_forward_grads[k][n][n][j])
1164 * mapping_data.jacobian_pushed_forward_grads[k][n][n][i]);
1166 for (
unsigned int m=0; m<spacedim; ++m)
1168 transformed_shape_hessians[k][d][i][j]
1169 -= (mapping_data.jacobian_pushed_forward_grads[k][d][i][m]
1170 * mapping_data.jacobian_pushed_forward_grads[k][m][n][j]
1172 + (mapping_data.jacobian_pushed_forward_grads[k][d][m][j]
1173 * mapping_data.jacobian_pushed_forward_grads[k][m][i][n]
1176 transformed_shape_hessians[k][d][i][j]
1177 += (mapping_data.jacobian_pushed_forward_grads[k][n][i][m]
1178 * mapping_data.jacobian_pushed_forward_grads[k][m][n][j]
1180 + (mapping_data.jacobian_pushed_forward_grads[k][n][m][j]
1181 * mapping_data.jacobian_pushed_forward_grads[k][m][i][n]
1186 for (
unsigned int k=0; k<n_q_points; ++k)
1187 for (
unsigned int d=0; d<dim; ++d)
1188 output_data.
shape_hessians[first+d][k] = fe_data.sign_change[i] * transformed_shape_hessians[k][d];
1195 for (
unsigned int k=0; k<n_q_points; ++k)
1196 fe_data.untransformed_shape_hessian_tensors[k+offset] = fe_data.shape_grad_grads[i][k+offset];
1199 =
make_array_view(fe_data.transformed_shape_hessians, offset, n_q_points);
1203 transformed_shape_hessians);
1205 for (
unsigned int k=0; k<n_q_points; ++k)
1206 for (
unsigned int d=0; d<spacedim; ++d)
1207 for (
unsigned int n=0; n<spacedim; ++n)
1208 for (
unsigned int i=0; i<spacedim; ++i)
1209 for (
unsigned int j=0; j<spacedim; ++j)
1211 transformed_shape_hessians[k][d][i][j]
1213 * mapping_data.jacobian_pushed_forward_2nd_derivatives[k][n][d][i][j])
1215 * mapping_data.jacobian_pushed_forward_grads[k][n][i][j])
1217 * mapping_data.jacobian_pushed_forward_grads[k][n][d][j])
1219 * mapping_data.jacobian_pushed_forward_grads[k][n][i][d]);
1222 for (
unsigned int k=0; k<n_q_points; ++k)
1223 for (
unsigned int d=0; d<dim; ++d)
1224 output_data.
shape_hessians[first+d][k] = fe_data.sign_change[i] * transformed_shape_hessians[k][d];
1230 Assert(
false, ExcNotImplemented());
1237 Assert(
false, ExcNotImplemented())
1244 template <
class PolynomialType,
int dim,
int spacedim>
1249 const unsigned int face_no,
1250 const unsigned int sub_no,
1254 const ::internal::FEValues::MappingRelatedData<dim, spacedim> &mapping_data,
1262 Assert (dynamic_cast<const InternalData *> (&fe_internal) != 0,
1263 ExcInternalError());
1264 const InternalData &fe_data =
static_cast<const InternalData &
> (fe_internal);
1266 const unsigned int n_q_points = quadrature.
size();
1273 cell->face_orientation(face_no),
1274 cell->face_flip(face_no),
1275 cell->face_rotation(face_no),
1277 cell->subface_case(face_no));
1289 std::fill( fe_data.sign_change.begin(), fe_data.sign_change.end(), 1.0 );
1292 get_face_sign_change_rt (cell, this->dofs_per_face, fe_data.sign_change);
1295 get_face_sign_change_nedelec (cell, this->dofs_per_face, fe_data.sign_change);
1297 for (
unsigned int i=0; i<this->dofs_per_cell; ++i)
1300 this->get_nonzero_components(i).first_selected_component()];
1304 switch (mapping_type)
1308 for (
unsigned int k=0; k<n_q_points; ++k)
1309 for (
unsigned int d=0; d<dim; ++d)
1310 output_data.
shape_values(first+d,k) = fe_data.shape_values[i][k+offset][d];
1318 =
make_array_view(fe_data.transformed_shape_values, offset, n_q_points);
1322 transformed_shape_values);
1324 for (
unsigned int k=0; k<n_q_points; ++k)
1325 for (
unsigned int d=0; d<dim; ++d)
1326 output_data.
shape_values(first+d,k) = transformed_shape_values[k][d];
1335 =
make_array_view(fe_data.transformed_shape_values, offset, n_q_points);
1340 transformed_shape_values);
1341 for (
unsigned int k=0; k<n_q_points; ++k)
1342 for (
unsigned int d=0; d<dim; ++d)
1344 = fe_data.sign_change[i] * transformed_shape_values[k][d];
1351 =
make_array_view(fe_data.transformed_shape_values, offset, n_q_points);
1356 transformed_shape_values);
1358 for (
unsigned int k = 0; k < n_q_points; ++k)
1359 for (
unsigned int d = 0; d < dim; ++d)
1361 fe_data.sign_change[i] * transformed_shape_values[k][d];
1367 Assert(
false, ExcNotImplemented());
1374 =
make_array_view(fe_data.transformed_shape_grads, offset, n_q_points);
1375 switch (mapping_type)
1382 transformed_shape_grads);
1383 for (
unsigned int k=0; k<n_q_points; ++k)
1384 for (
unsigned int d=0; d<dim; ++d)
1385 output_data.
shape_gradients[first+d][k] = transformed_shape_grads[k][d];
1394 transformed_shape_grads);
1396 for (
unsigned int k=0; k<n_q_points; ++k)
1397 for (
unsigned int d=0; d<spacedim; ++d)
1398 for (
unsigned int n=0; n<spacedim; ++n)
1399 transformed_shape_grads[k][d] -= output_data.
shape_values(first+n,k)
1400 * mapping_data.jacobian_pushed_forward_grads[k][n][d];
1402 for (
unsigned int k=0; k<n_q_points; ++k)
1403 for (
unsigned int d=0; d<dim; ++d)
1404 output_data.
shape_gradients[first+d][k] = transformed_shape_grads[k][d];
1411 for (
unsigned int k=0; k<n_q_points; ++k)
1412 fe_data.untransformed_shape_grads[k+offset] = fe_data.shape_grads[i][k+offset];
1417 transformed_shape_grads);
1419 for (
unsigned int k=0; k<n_q_points; ++k)
1420 for (
unsigned int d=0; d<spacedim; ++d)
1421 for (
unsigned int n=0; n<spacedim; ++n)
1422 transformed_shape_grads[k][d] += output_data.
shape_values(first+n,k)
1423 * mapping_data.jacobian_pushed_forward_grads[k][d][n];
1425 for (
unsigned int k=0; k<n_q_points; ++k)
1426 for (
unsigned int d=0; d<dim; ++d)
1427 output_data.
shape_gradients[first+d][k] = transformed_shape_grads[k][d];
1435 for (
unsigned int k=0; k<n_q_points; ++k)
1436 fe_data.untransformed_shape_grads[k+offset] = fe_data.shape_grads[i][k+offset];
1441 transformed_shape_grads);
1443 for (
unsigned int k=0; k<n_q_points; ++k)
1444 for (
unsigned int d=0; d<spacedim; ++d)
1445 for (
unsigned int n=0; n<spacedim; ++n)
1446 transformed_shape_grads[k][d] += ( output_data.
shape_values(first+n,k)
1447 * mapping_data.jacobian_pushed_forward_grads[k][d][n])
1449 * mapping_data.jacobian_pushed_forward_grads[k][n][n]);
1451 for (
unsigned int k=0; k<n_q_points; ++k)
1452 for (
unsigned int d=0; d<dim; ++d)
1454 fe_data.sign_change[i] * transformed_shape_grads[k][d];
1470 for (
unsigned int k=0; k<n_q_points; ++k)
1471 fe_data.untransformed_shape_grads[k+offset] = fe_data.shape_grads[i][k+offset];
1476 transformed_shape_grads);
1478 for (
unsigned int k=0; k<n_q_points; ++k)
1479 for (
unsigned int d=0; d<spacedim; ++d)
1480 for (
unsigned int n=0; n<spacedim; ++n)
1481 transformed_shape_grads[k][d] -= output_data.
shape_values(first+n,k)
1482 * mapping_data.jacobian_pushed_forward_grads[k][n][d];
1484 for (
unsigned int k = 0; k < n_q_points; ++k)
1485 for (
unsigned int d = 0; d < dim; ++d)
1487 fe_data.sign_change[i] * transformed_shape_grads[k][d];
1493 Assert(
false, ExcNotImplemented());
1499 switch (mapping_type)
1504 =
make_array_view(fe_data.transformed_shape_hessians, offset, n_q_points);
1507 transformed_shape_hessians);
1509 for (
unsigned int k=0; k<n_q_points; ++k)
1510 for (
unsigned int d=0; d<spacedim; ++d)
1511 for (
unsigned int n=0; n<spacedim; ++n)
1512 transformed_shape_hessians[k][d] -= output_data.
shape_gradients[first+d][k][n]
1513 *mapping_data.jacobian_pushed_forward_grads[k][n];
1515 for (
unsigned int k=0; k<n_q_points; ++k)
1516 for (
unsigned int d=0; d<dim; ++d)
1517 output_data.
shape_hessians[first+d][k] = transformed_shape_hessians[k][d];
1524 for (
unsigned int k=0; k<n_q_points; ++k)
1525 fe_data.untransformed_shape_hessian_tensors[k+offset] = fe_data.shape_grad_grads[i][k+offset];
1528 =
make_array_view(fe_data.transformed_shape_hessians, offset, n_q_points);
1532 transformed_shape_hessians);
1534 for (
unsigned int k=0; k<n_q_points; ++k)
1535 for (
unsigned int d=0; d<spacedim; ++d)
1536 for (
unsigned int n=0; n<spacedim; ++n)
1537 for (
unsigned int i=0; i<spacedim; ++i)
1538 for (
unsigned int j=0; j<spacedim; ++j)
1540 transformed_shape_hessians[k][d][i][j]
1542 * mapping_data.jacobian_pushed_forward_2nd_derivatives[k][n][d][i][j])
1544 * mapping_data.jacobian_pushed_forward_grads[k][n][i][j])
1546 * mapping_data.jacobian_pushed_forward_grads[k][n][d][j])
1548 * mapping_data.jacobian_pushed_forward_grads[k][n][i][d]);
1551 for (
unsigned int k=0; k<n_q_points; ++k)
1552 for (
unsigned int d=0; d<dim; ++d)
1553 output_data.
shape_hessians[first+d][k] = transformed_shape_hessians[k][d];
1561 for (
unsigned int k=0; k<n_q_points; ++k)
1562 fe_data.untransformed_shape_hessian_tensors[k+offset] = fe_data.shape_grad_grads[i][k+offset];
1565 =
make_array_view(fe_data.transformed_shape_hessians, offset, n_q_points);
1569 transformed_shape_hessians);
1571 for (
unsigned int k=0; k<n_q_points; ++k)
1572 for (
unsigned int d=0; d<spacedim; ++d)
1573 for (
unsigned int n=0; n<spacedim; ++n)
1574 for (
unsigned int i=0; i<spacedim; ++i)
1575 for (
unsigned int j=0; j<spacedim; ++j)
1577 transformed_shape_hessians[k][d][i][j]
1579 * mapping_data.jacobian_pushed_forward_2nd_derivatives[k][d][n][i][j])
1581 * mapping_data.jacobian_pushed_forward_grads[k][d][n][j])
1583 * mapping_data.jacobian_pushed_forward_grads[k][d][i][n])
1585 * mapping_data.jacobian_pushed_forward_grads[k][n][i][j]);
1586 for (
unsigned int m=0; m<spacedim; ++m)
1587 transformed_shape_hessians[k][d][i][j]
1588 -= (mapping_data.jacobian_pushed_forward_grads[k][d][i][m]
1589 * mapping_data.jacobian_pushed_forward_grads[k][m][n][j]
1591 + (mapping_data.jacobian_pushed_forward_grads[k][d][m][j]
1592 * mapping_data.jacobian_pushed_forward_grads[k][m][i][n]
1596 for (
unsigned int k=0; k<n_q_points; ++k)
1597 for (
unsigned int d=0; d<dim; ++d)
1598 output_data.
shape_hessians[first+d][k] = transformed_shape_hessians[k][d];
1607 for (
unsigned int k=0; k<n_q_points; ++k)
1608 fe_data.untransformed_shape_hessian_tensors[k+offset] = fe_data.shape_grad_grads[i][k+offset];
1611 =
make_array_view(fe_data.transformed_shape_hessians, offset, n_q_points);
1615 transformed_shape_hessians);
1617 for (
unsigned int k=0; k<n_q_points; ++k)
1618 for (
unsigned int d=0; d<spacedim; ++d)
1619 for (
unsigned int n=0; n<spacedim; ++n)
1620 for (
unsigned int i=0; i<spacedim; ++i)
1621 for (
unsigned int j=0; j<spacedim; ++j)
1623 transformed_shape_hessians[k][d][i][j]
1625 * mapping_data.jacobian_pushed_forward_2nd_derivatives[k][d][n][i][j])
1627 * mapping_data.jacobian_pushed_forward_grads[k][d][n][j])
1629 * mapping_data.jacobian_pushed_forward_grads[k][d][i][n])
1631 * mapping_data.jacobian_pushed_forward_grads[k][n][i][j]);
1633 transformed_shape_hessians[k][d][i][j]
1635 * mapping_data.jacobian_pushed_forward_2nd_derivatives[k][n][n][i][j])
1637 * mapping_data.jacobian_pushed_forward_grads[k][n][n][j])
1639 * mapping_data.jacobian_pushed_forward_grads[k][n][n][i]);
1640 for (
unsigned int m=0; m<spacedim; ++m)
1642 transformed_shape_hessians[k][d][i][j]
1643 -= (mapping_data.jacobian_pushed_forward_grads[k][d][i][m]
1644 * mapping_data.jacobian_pushed_forward_grads[k][m][n][j]
1646 + (mapping_data.jacobian_pushed_forward_grads[k][d][m][j]
1647 * mapping_data.jacobian_pushed_forward_grads[k][m][i][n]
1650 transformed_shape_hessians[k][d][i][j]
1651 += (mapping_data.jacobian_pushed_forward_grads[k][n][i][m]
1652 * mapping_data.jacobian_pushed_forward_grads[k][m][n][j]
1654 + (mapping_data.jacobian_pushed_forward_grads[k][n][m][j]
1655 * mapping_data.jacobian_pushed_forward_grads[k][m][i][n]
1660 for (
unsigned int k=0; k<n_q_points; ++k)
1661 for (
unsigned int d=0; d<dim; ++d)
1662 output_data.
shape_hessians[first+d][k] = fe_data.sign_change[i] * transformed_shape_hessians[k][d];
1670 for (
unsigned int k=0; k<n_q_points; ++k)
1671 fe_data.untransformed_shape_hessian_tensors[k+offset] = fe_data.shape_grad_grads[i][k+offset];
1674 =
make_array_view(fe_data.transformed_shape_hessians, offset, n_q_points);
1678 transformed_shape_hessians);
1680 for (
unsigned int k=0; k<n_q_points; ++k)
1681 for (
unsigned int d=0; d<spacedim; ++d)
1682 for (
unsigned int n=0; n<spacedim; ++n)
1683 for (
unsigned int i=0; i<spacedim; ++i)
1684 for (
unsigned int j=0; j<spacedim; ++j)
1686 transformed_shape_hessians[k][d][i][j]
1688 * mapping_data.jacobian_pushed_forward_2nd_derivatives[k][n][d][i][j])
1690 * mapping_data.jacobian_pushed_forward_grads[k][n][i][j])
1692 * mapping_data.jacobian_pushed_forward_grads[k][n][d][j])
1694 * mapping_data.jacobian_pushed_forward_grads[k][n][i][d]);
1697 for (
unsigned int k=0; k<n_q_points; ++k)
1698 for (
unsigned int d=0; d<dim; ++d)
1699 output_data.
shape_hessians[first+d][k] = fe_data.sign_change[i] * transformed_shape_hessians[k][d];
1706 Assert(
false, ExcNotImplemented());
1713 Assert(
false, ExcNotImplemented())
1720 template <
class PolynomialType,
int dim,
int spacedim>
1726 switch (mapping_type)
1737 out |= update_hessians | update_values | update_gradients |
1752 out |= update_hessians |
update_piola | update_values | update_gradients |
1770 out |= update_hessians |
update_piola | update_values | update_gradients |
1789 out |= update_hessians | update_values | update_gradients |
1799 Assert (
false, ExcNotImplemented());
1808 #include "fe_poly_tensor.inst" 1811 DEAL_II_NAMESPACE_CLOSE
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
Contravariant transformation.
virtual Tensor< 1, dim > shape_grad_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const
virtual Tensor< 1, dim > shape_grad(const unsigned int i, const Point< dim > &p) const
FE_PolyTensor(const unsigned int degree, const FiniteElementData< dim > &fe_data, const std::vector< bool > &restriction_is_additive_flags, const std::vector< ComponentMask > &nonzero_components)
virtual Tensor< 2, dim > shape_grad_grad_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const
virtual double shape_value(const unsigned int i, const Point< dim > &p) const
virtual UpdateFlags requires_update_flags(const UpdateFlags update_flags) const
Third derivatives of shape functions.
#define Assert(cond, exc)
Abstract base class for mapping classes.
Second derivatives of shape functions.
unsigned int size() const
virtual Tensor< 2, dim > shape_grad_grad(const unsigned int i, const Point< dim > &p) const
ArrayView< ElementType > make_array_view(std::vector< ElementType > &vector)
Shape function gradients.
static DataSetDescriptor subface(const unsigned int face_no, const unsigned int subface_no, const bool face_orientation, const bool face_flip, const bool face_rotation, const unsigned int n_quadrature_points, const internal::SubfaceCase< dim > ref_case=internal::SubfaceCase< dim >::case_isotropic)
virtual double shape_value_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const
unsigned int n_components(const DoFHandler< dim, spacedim > &dh)
Values needed for Piola transform.
Covariant transformation.
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)