17 #include <deal.II/base/derivative_form.h> 18 #include <deal.II/base/quadrature.h> 19 #include <deal.II/base/qprojector.h> 20 #include <deal.II/base/quadrature_lib.h> 21 #include <deal.II/base/tensor_product_polynomials.h> 22 #include <deal.II/base/memory_consumption.h> 23 #include <deal.II/base/std_cxx11/array.h> 24 #include <deal.II/base/std_cxx11/unique_ptr.h> 25 #include <deal.II/lac/full_matrix.h> 26 #include <deal.II/grid/tria.h> 27 #include <deal.II/grid/tria_iterator.h> 28 #include <deal.II/grid/tria_boundary.h> 29 #include <deal.II/dofs/dof_accessor.h> 30 #include <deal.II/fe/fe_tools.h> 31 #include <deal.II/fe/fe.h> 32 #include <deal.II/fe/fe_values.h> 33 #include <deal.II/fe/mapping_q_generic.h> 34 #include <deal.II/fe/mapping_q1.h> 41 DEAL_II_NAMESPACE_OPEN
55 template<
int spacedim>
57 transform_real_to_unit_cell
61 Assert(spacedim == 1, ExcInternalError());
62 return Point<1>((p[0] - vertices[0](0))/(vertices[1](0) - vertices[0](0)));
67 template<
int spacedim>
69 transform_real_to_unit_cell
73 Assert(spacedim == 2, ExcInternalError());
74 const double x = p(0);
75 const double y = p(1);
77 const double x0 = vertices[0](0);
78 const double x1 = vertices[1](0);
79 const double x2 = vertices[2](0);
80 const double x3 = vertices[3](0);
82 const double y0 = vertices[0](1);
83 const double y1 = vertices[1](1);
84 const double y2 = vertices[2](1);
85 const double y3 = vertices[3](1);
87 const double a = (x1 - x3)*(y0 - y2) - (x0 - x2)*(y1 - y3);
88 const double b = -(x0 - x1 - x2 + x3)*y + (x - 2*x1 + x3)*y0 - (x - 2*x0 + x2)*y1
89 - (x - x1)*y2 + (x - x0)*y3;
90 const double c = (x0 - x1)*y - (x - x1)*y0 + (x - x0)*y1;
92 const double discriminant = b*b - 4*a*c;
95 if (discriminant < 0.0)
104 if (a == 0.0 && b != 0.0)
111 else if (std::abs(c) < 1e-12*std::abs(b)
112 || std::abs(std::sqrt(discriminant) - b) <= 1e-14*std::abs(b))
114 eta1 = (-b - std::sqrt(discriminant)) / (2*a);
115 eta2 = (-b + std::sqrt(discriminant)) / (2*a);
120 eta1 = 2*c / (-b - std::sqrt(discriminant));
121 eta2 = 2*c / (-b + std::sqrt(discriminant));
124 const double eta = (std::abs(eta1 - 0.5) < std::abs(eta2 - 0.5)) ? eta1 : eta2;
130 const double subexpr0 = -eta*x2 + x0*(eta - 1);
131 const double xi_denominator0 = eta*x3 - x1*(eta - 1) + subexpr0;
132 const double max_x = std::max(std::max(std::abs(x0), std::abs(x1)),
133 std::max(std::abs(x2), std::abs(x3)));
135 if (std::abs(xi_denominator0) > 1e-10*max_x)
137 const double xi = (x + subexpr0)/xi_denominator0;
142 const double max_y = std::max(std::max(std::abs(y0), std::abs(y1)),
143 std::max(std::abs(y2), std::abs(y3)));
144 const double subexpr1 = -eta*y2 + y0*(eta - 1);
145 const double xi_denominator1 = eta*y3 - y1*(eta - 1) + subexpr1;
146 if (std::abs(xi_denominator1) > 1e-10*max_y)
148 const double xi = (subexpr1 + y)/xi_denominator1;
159 Assert(
false, ExcInternalError());
160 return Point<2>(std::numeric_limits<double>::quiet_NaN(),
161 std::numeric_limits<double>::quiet_NaN());
166 template<
int spacedim>
168 transform_real_to_unit_cell
173 Assert(
false, ExcInternalError());
207 struct TransformR2UInitialGuess
222 TransformR2UInitialGuess<1>::
231 TransformR2UInitialGuess<1>::
243 TransformR2UInitialGuess<2>::
246 {-0.500000, -0.500000},
247 { 0.500000, -0.500000},
248 {-0.500000, 0.500000},
249 { 0.500000, 0.500000}
260 TransformR2UInitialGuess<2>::
262 {0.750000,0.250000,0.250000,-0.250000 };
267 TransformR2UInitialGuess<3>::
270 {-0.250000, -0.250000, -0.250000},
271 { 0.250000, -0.250000, -0.250000},
272 {-0.250000, 0.250000, -0.250000},
273 { 0.250000, 0.250000, -0.250000},
274 {-0.250000, -0.250000, 0.250000},
275 { 0.250000, -0.250000, 0.250000},
276 {-0.250000, 0.250000, 0.250000},
277 { 0.250000, 0.250000, 0.250000}
284 TransformR2UInitialGuess<3>::
286 {0.500000,0.250000,0.250000,0.000000,0.250000,0.000000,0.000000,-0.250000};
288 template<
int dim,
int spacedim>
290 transform_real_to_unit_cell_initial_guess (
const std::vector<
Point<spacedim> > &vertex,
298 KA.fill( (
double *)(TransformR2UInitialGuess<dim>::KA) );
299 for (
unsigned int i=0; i<GeometryInfo<dim>::vertices_per_cell; ++i)
300 Kb(i) = TransformR2UInitialGuess<dim>::Kb[i];
303 for (
unsigned int v=0; v<GeometryInfo<dim>::vertices_per_cell; v++)
304 for (
unsigned int i=0; i<spacedim; ++i)
305 Y(i,v) = vertex[v][i];
312 for (
unsigned int i=0; i<spacedim; ++i)
326 for (
unsigned int i=0; i<dim; ++i)
331 template <
int spacedim>
333 compute_shape_function_values (
const unsigned int n_shape_functions,
334 const std::vector<
Point<1> > &unit_points,
335 typename ::MappingQGeneric<1,spacedim>::InternalData &data)
337 (void)n_shape_functions;
338 const unsigned int n_points=unit_points.size();
339 for (
unsigned int k = 0 ; k < n_points ; ++k)
341 double x = unit_points[k](0);
343 if (data.shape_values.size()!=0)
345 Assert(data.shape_values.size()==n_shape_functions*n_points,
347 data.shape(k,0) = 1.-x;
350 if (data.shape_derivatives.size()!=0)
352 Assert(data.shape_derivatives.size()==n_shape_functions*n_points,
354 data.derivative(k,0)[0] = -1.;
355 data.derivative(k,1)[0] = 1.;
357 if (data.shape_second_derivatives.size()!=0)
361 Assert (spacedim == 1, ExcNotImplemented());
363 Assert(data.shape_second_derivatives.size()==n_shape_functions*n_points,
365 data.second_derivative(k,0)[0][0] = 0;
366 data.second_derivative(k,1)[0][0] = 0;
368 if (data.shape_third_derivatives.size()!=0)
371 Assert (spacedim == 1, ExcNotImplemented());
373 Assert(data.shape_third_derivatives.size()==n_shape_functions*n_points,
377 data.third_derivative(k,0) = zero;
378 data.third_derivative(k,1) = zero;
380 if (data.shape_fourth_derivatives.size()!=0)
383 Assert (spacedim == 1, ExcNotImplemented());
385 Assert(data.shape_fourth_derivatives.size()==n_shape_functions*n_points,
389 data.fourth_derivative(k,0) = zero;
390 data.fourth_derivative(k,1) = zero;
396 template <
int spacedim>
398 compute_shape_function_values (
const unsigned int n_shape_functions,
399 const std::vector<
Point<2> > &unit_points,
400 typename ::MappingQGeneric<2,spacedim>::InternalData &data)
402 (void)n_shape_functions;
403 const unsigned int n_points=unit_points.size();
404 for (
unsigned int k = 0 ; k < n_points ; ++k)
406 double x = unit_points[k](0);
407 double y = unit_points[k](1);
409 if (data.shape_values.size()!=0)
411 Assert(data.shape_values.size()==n_shape_functions*n_points,
413 data.shape(k,0) = (1.-x)*(1.-y);
414 data.shape(k,1) = x*(1.-y);
415 data.shape(k,2) = (1.-x)*y;
416 data.shape(k,3) = x*y;
418 if (data.shape_derivatives.size()!=0)
420 Assert(data.shape_derivatives.size()==n_shape_functions*n_points,
422 data.derivative(k,0)[0] = (y-1.);
423 data.derivative(k,1)[0] = (1.-y);
424 data.derivative(k,2)[0] = -y;
425 data.derivative(k,3)[0] = y;
426 data.derivative(k,0)[1] = (x-1.);
427 data.derivative(k,1)[1] = -x;
428 data.derivative(k,2)[1] = (1.-x);
429 data.derivative(k,3)[1] = x;
431 if (data.shape_second_derivatives.size()!=0)
433 Assert(data.shape_second_derivatives.size()==n_shape_functions*n_points,
435 data.second_derivative(k,0)[0][0] = 0;
436 data.second_derivative(k,1)[0][0] = 0;
437 data.second_derivative(k,2)[0][0] = 0;
438 data.second_derivative(k,3)[0][0] = 0;
439 data.second_derivative(k,0)[0][1] = 1.;
440 data.second_derivative(k,1)[0][1] = -1.;
441 data.second_derivative(k,2)[0][1] = -1.;
442 data.second_derivative(k,3)[0][1] = 1.;
443 data.second_derivative(k,0)[1][0] = 1.;
444 data.second_derivative(k,1)[1][0] = -1.;
445 data.second_derivative(k,2)[1][0] = -1.;
446 data.second_derivative(k,3)[1][0] = 1.;
447 data.second_derivative(k,0)[1][1] = 0;
448 data.second_derivative(k,1)[1][1] = 0;
449 data.second_derivative(k,2)[1][1] = 0;
450 data.second_derivative(k,3)[1][1] = 0;
452 if (data.shape_third_derivatives.size()!=0)
454 Assert(data.shape_third_derivatives.size()==n_shape_functions*n_points,
458 for (
unsigned int i=0; i<4; ++i)
459 data.third_derivative(k,i) = zero;
461 if (data.shape_fourth_derivatives.size()!=0)
463 Assert(data.shape_fourth_derivatives.size()==n_shape_functions*n_points,
466 for (
unsigned int i=0; i<4; ++i)
467 data.fourth_derivative(k,i) = zero;
474 template <
int spacedim>
476 compute_shape_function_values (
const unsigned int n_shape_functions,
477 const std::vector<
Point<3> > &unit_points,
478 typename ::MappingQGeneric<3,spacedim>::InternalData &data)
480 (void)n_shape_functions;
481 const unsigned int n_points=unit_points.size();
482 for (
unsigned int k = 0 ; k < n_points ; ++k)
484 double x = unit_points[k](0);
485 double y = unit_points[k](1);
486 double z = unit_points[k](2);
488 if (data.shape_values.size()!=0)
490 Assert(data.shape_values.size()==n_shape_functions*n_points,
492 data.shape(k,0) = (1.-x)*(1.-y)*(1.-z);
493 data.shape(k,1) = x*(1.-y)*(1.-z);
494 data.shape(k,2) = (1.-x)*y*(1.-z);
495 data.shape(k,3) = x*y*(1.-z);
496 data.shape(k,4) = (1.-x)*(1.-y)*z;
497 data.shape(k,5) = x*(1.-y)*z;
498 data.shape(k,6) = (1.-x)*y*z;
499 data.shape(k,7) = x*y*z;
501 if (data.shape_derivatives.size()!=0)
503 Assert(data.shape_derivatives.size()==n_shape_functions*n_points,
505 data.derivative(k,0)[0] = (y-1.)*(1.-z);
506 data.derivative(k,1)[0] = (1.-y)*(1.-z);
507 data.derivative(k,2)[0] = -y*(1.-z);
508 data.derivative(k,3)[0] = y*(1.-z);
509 data.derivative(k,4)[0] = (y-1.)*z;
510 data.derivative(k,5)[0] = (1.-y)*z;
511 data.derivative(k,6)[0] = -y*z;
512 data.derivative(k,7)[0] = y*z;
513 data.derivative(k,0)[1] = (x-1.)*(1.-z);
514 data.derivative(k,1)[1] = -x*(1.-z);
515 data.derivative(k,2)[1] = (1.-x)*(1.-z);
516 data.derivative(k,3)[1] = x*(1.-z);
517 data.derivative(k,4)[1] = (x-1.)*z;
518 data.derivative(k,5)[1] = -x*z;
519 data.derivative(k,6)[1] = (1.-x)*z;
520 data.derivative(k,7)[1] = x*z;
521 data.derivative(k,0)[2] = (x-1)*(1.-y);
522 data.derivative(k,1)[2] = x*(y-1.);
523 data.derivative(k,2)[2] = (x-1.)*y;
524 data.derivative(k,3)[2] = -x*y;
525 data.derivative(k,4)[2] = (1.-x)*(1.-y);
526 data.derivative(k,5)[2] = x*(1.-y);
527 data.derivative(k,6)[2] = (1.-x)*y;
528 data.derivative(k,7)[2] = x*y;
530 if (data.shape_second_derivatives.size()!=0)
534 Assert (spacedim == 3, ExcNotImplemented());
536 Assert(data.shape_second_derivatives.size()==n_shape_functions*n_points,
538 data.second_derivative(k,0)[0][0] = 0;
539 data.second_derivative(k,1)[0][0] = 0;
540 data.second_derivative(k,2)[0][0] = 0;
541 data.second_derivative(k,3)[0][0] = 0;
542 data.second_derivative(k,4)[0][0] = 0;
543 data.second_derivative(k,5)[0][0] = 0;
544 data.second_derivative(k,6)[0][0] = 0;
545 data.second_derivative(k,7)[0][0] = 0;
546 data.second_derivative(k,0)[1][1] = 0;
547 data.second_derivative(k,1)[1][1] = 0;
548 data.second_derivative(k,2)[1][1] = 0;
549 data.second_derivative(k,3)[1][1] = 0;
550 data.second_derivative(k,4)[1][1] = 0;
551 data.second_derivative(k,5)[1][1] = 0;
552 data.second_derivative(k,6)[1][1] = 0;
553 data.second_derivative(k,7)[1][1] = 0;
554 data.second_derivative(k,0)[2][2] = 0;
555 data.second_derivative(k,1)[2][2] = 0;
556 data.second_derivative(k,2)[2][2] = 0;
557 data.second_derivative(k,3)[2][2] = 0;
558 data.second_derivative(k,4)[2][2] = 0;
559 data.second_derivative(k,5)[2][2] = 0;
560 data.second_derivative(k,6)[2][2] = 0;
561 data.second_derivative(k,7)[2][2] = 0;
563 data.second_derivative(k,0)[0][1] = (1.-z);
564 data.second_derivative(k,1)[0][1] = -(1.-z);
565 data.second_derivative(k,2)[0][1] = -(1.-z);
566 data.second_derivative(k,3)[0][1] = (1.-z);
567 data.second_derivative(k,4)[0][1] = z;
568 data.second_derivative(k,5)[0][1] = -z;
569 data.second_derivative(k,6)[0][1] = -z;
570 data.second_derivative(k,7)[0][1] = z;
571 data.second_derivative(k,0)[1][0] = (1.-z);
572 data.second_derivative(k,1)[1][0] = -(1.-z);
573 data.second_derivative(k,2)[1][0] = -(1.-z);
574 data.second_derivative(k,3)[1][0] = (1.-z);
575 data.second_derivative(k,4)[1][0] = z;
576 data.second_derivative(k,5)[1][0] = -z;
577 data.second_derivative(k,6)[1][0] = -z;
578 data.second_derivative(k,7)[1][0] = z;
580 data.second_derivative(k,0)[0][2] = (1.-y);
581 data.second_derivative(k,1)[0][2] = -(1.-y);
582 data.second_derivative(k,2)[0][2] = y;
583 data.second_derivative(k,3)[0][2] = -y;
584 data.second_derivative(k,4)[0][2] = -(1.-y);
585 data.second_derivative(k,5)[0][2] = (1.-y);
586 data.second_derivative(k,6)[0][2] = -y;
587 data.second_derivative(k,7)[0][2] = y;
588 data.second_derivative(k,0)[2][0] = (1.-y);
589 data.second_derivative(k,1)[2][0] = -(1.-y);
590 data.second_derivative(k,2)[2][0] = y;
591 data.second_derivative(k,3)[2][0] = -y;
592 data.second_derivative(k,4)[2][0] = -(1.-y);
593 data.second_derivative(k,5)[2][0] = (1.-y);
594 data.second_derivative(k,6)[2][0] = -y;
595 data.second_derivative(k,7)[2][0] = y;
597 data.second_derivative(k,0)[1][2] = (1.-x);
598 data.second_derivative(k,1)[1][2] = x;
599 data.second_derivative(k,2)[1][2] = -(1.-x);
600 data.second_derivative(k,3)[1][2] = -x;
601 data.second_derivative(k,4)[1][2] = -(1.-x);
602 data.second_derivative(k,5)[1][2] = -x;
603 data.second_derivative(k,6)[1][2] = (1.-x);
604 data.second_derivative(k,7)[1][2] = x;
605 data.second_derivative(k,0)[2][1] = (1.-x);
606 data.second_derivative(k,1)[2][1] = x;
607 data.second_derivative(k,2)[2][1] = -(1.-x);
608 data.second_derivative(k,3)[2][1] = -x;
609 data.second_derivative(k,4)[2][1] = -(1.-x);
610 data.second_derivative(k,5)[2][1] = -x;
611 data.second_derivative(k,6)[2][1] = (1.-x);
612 data.second_derivative(k,7)[2][1] = x;
614 if (data.shape_third_derivatives.size()!=0)
617 Assert (spacedim == 3, ExcNotImplemented());
619 Assert(data.shape_third_derivatives.size()==n_shape_functions*n_points,
622 for (
unsigned int i=0; i<3; ++i)
623 for (
unsigned int j=0; j<3; ++j)
624 for (
unsigned int l=0; l<3; ++l)
625 if ((i==j)||(j==l)||(l==i))
627 for (
unsigned int m=0; m<8; ++m)
628 data.third_derivative(k,m)[i][j][l] = 0;
632 data.third_derivative(k,0)[i][j][l] = -1.;
633 data.third_derivative(k,1)[i][j][l] = 1.;
634 data.third_derivative(k,2)[i][j][l] = 1.;
635 data.third_derivative(k,3)[i][j][l] = -1.;
636 data.third_derivative(k,4)[i][j][l] = 1.;
637 data.third_derivative(k,5)[i][j][l] = -1.;
638 data.third_derivative(k,6)[i][j][l] = -1.;
639 data.third_derivative(k,7)[i][j][l] = 1.;
643 if (data.shape_fourth_derivatives.size()!=0)
646 Assert (spacedim == 3, ExcNotImplemented());
648 Assert(data.shape_fourth_derivatives.size()==n_shape_functions*n_points,
651 for (
unsigned int i=0; i<8; ++i)
652 data.fourth_derivative(k,i) = zero;
664 template<
int dim,
int spacedim>
667 polynomial_degree (polynomial_degree),
668 n_shape_functions (
Utilities::fixed_power<dim>(polynomial_degree+1))
673 template<
int dim,
int spacedim>
692 template <
int dim,
int spacedim>
697 const unsigned int n_original_q_points)
703 const unsigned int n_q_points = q.
size();
752 template <
int dim,
int spacedim>
757 const unsigned int n_original_q_points)
759 initialize (update_flags, q, n_original_q_points);
776 static const int tangential_orientation[4]= {-1,1,1,-1};
777 for (
unsigned int i=0; i<nfaces; ++i)
780 tang[1-i/2]=tangential_orientation[i];
787 for (
unsigned int i=0; i<nfaces; ++i)
791 const unsigned int nd=
803 tang2[(nd+2)%dim]=1.;
823 std::vector<unsigned int>
824 get_dpo_vector (
const unsigned int degree)
826 std::vector<unsigned int> dpo(dim+1, 1U);
827 for (
unsigned int i=1; i<dpo.size(); ++i)
828 dpo[i]=dpo[i-1]*(degree-1);
835 template<
int dim,
int spacedim>
850 const unsigned int n_points=unit_points.size();
857 Assert (n_shape_functions==tensor_pols.
n(),
861 const std::vector<unsigned int>
863 lexicographic_to_hierarchic_numbering (
867 std::vector<double> values;
868 std::vector<Tensor<1,dim> > grads;
873 values.resize(n_shape_functions);
879 grads.resize(n_shape_functions);
882 std::vector<Tensor<2,dim> > grad2;
887 grad2.resize(n_shape_functions);
890 std::vector<Tensor<3,dim> > grad3;
895 grad3.resize(n_shape_functions);
898 std::vector<Tensor<4,dim> > grad4;
903 grad4.resize(n_shape_functions);
912 for (
unsigned int point=0; point<n_points; ++point)
914 tensor_pols.
compute(unit_points[point], values, grads, grad2, grad3, grad4);
918 shape(point,renumber[i]) = values[i];
957 Assert(lvs.n_rows()==0, ExcInternalError());
958 Assert(dim==2 || dim==3, ExcNotImplemented());
962 Assert(polynomial_degree>1, ExcInternalError());
964 const unsigned int n_inner = Utilities::fixed_power<dim>(polynomial_degree-1);
965 const unsigned int n_outer = (dim==1) ? 2 :
967 4+4*(polynomial_degree-1) :
968 8+12*(polynomial_degree-1)+6*(polynomial_degree-1)*(polynomial_degree-1));
973 const unsigned int n_q_points=quadrature.
size();
982 for (
unsigned int point=0; point<n_q_points; ++point)
983 for (
unsigned int i=0; i<n_inner; ++i)
984 for (
unsigned int j=0; j<n_inner; ++j)
986 long double res = 0.;
987 for (
unsigned int l=0; l<dim; ++l)
988 res += (
long double)quadrature_data.
derivative(point, n_outer+i)[l] *
989 (
long double)quadrature_data.
derivative(point, n_outer+j)[l];
991 S(i,j) += res * (
long double)quadrature.
weight(point);
997 for (
unsigned int point=0; point<n_q_points; ++point)
998 for (
unsigned int i=0; i<n_inner; ++i)
999 for (
unsigned int k=0; k<n_outer; ++k)
1001 long double res = 0.;
1002 for (
unsigned int l=0; l<dim; ++l)
1003 res += (
long double)quadrature_data.
derivative(point, n_outer+i)[l] *
1004 (
long double)quadrature_data.
derivative(point, k)[l];
1006 T(i,k) += res *(
long double)quadrature.
weight(point);
1018 lvs.
reinit (n_inner, n_outer);
1019 for (
unsigned int i=0; i<n_inner; ++i)
1020 for (
unsigned int k=0; k<n_outer; ++k)
1021 lvs(i,k) = -S_1_T(i,k);
1040 compute_support_point_weights_on_quad(
const unsigned int polynomial_degree)
1050 if (polynomial_degree == 1)
1053 const unsigned int n_inner_2d=(polynomial_degree-1)*(polynomial_degree-1);
1054 const unsigned int n_outer_2d=4+4*(polynomial_degree-1);
1058 if (polynomial_degree == 2)
1063 static const double loqv2[1*8]
1064 = {1/16., 1/16., 1/16., 1/16., 3/16., 3/16., 3/16., 3/16.};
1065 Assert (
sizeof(loqv2)/
sizeof(loqv2[0]) ==
1066 n_inner_2d * n_outer_2d,
1067 ExcInternalError());
1070 loqvs.
reinit(n_inner_2d, n_outer_2d);
1071 for (
unsigned int unit_point=0; unit_point<n_inner_2d; ++unit_point)
1072 for (
unsigned int k=0; k<n_outer_2d; ++k)
1073 loqvs[unit_point][k] = loqv2[unit_point*n_outer_2d+k];
1083 for (
unsigned int unit_point=0; unit_point<loqvs.n_rows(); ++unit_point)
1084 Assert(std::fabs(std::accumulate(loqvs[unit_point].begin(),
1086 ExcInternalError());
1104 compute_support_point_weights_on_hex(
const unsigned int polynomial_degree)
1114 if (polynomial_degree == 1)
1117 const unsigned int n_inner = Utilities::fixed_power<dim>(polynomial_degree-1);
1118 const unsigned int n_outer = 8+12*(polynomial_degree-1)+6*(polynomial_degree-1)*(polynomial_degree-1);
1122 if (polynomial_degree == 2)
1124 static const double lohv2[26]
1125 = {1/128., 1/128., 1/128., 1/128., 1/128., 1/128., 1/128., 1/128.,
1126 7/192., 7/192., 7/192., 7/192., 7/192., 7/192., 7/192., 7/192.,
1127 7/192., 7/192., 7/192., 7/192.,
1128 1/12., 1/12., 1/12., 1/12., 1/12., 1/12.
1132 lohvs.
reinit(n_inner, n_outer);
1133 for (
unsigned int unit_point=0; unit_point<n_inner; ++unit_point)
1134 for (
unsigned int k=0; k<n_outer; ++k)
1135 lohvs[unit_point][k] = lohv2[unit_point*n_outer+k];
1145 for (
unsigned int unit_point=0; unit_point<n_inner; ++unit_point)
1146 Assert(std::fabs(std::accumulate(lohvs[unit_point].begin(),
1148 ExcInternalError());
1157 template<
int dim,
int spacedim>
1166 Assert (p >= 1,
ExcMessage (
"It only makes sense to create polynomial mappings " 1167 "with a polynomial degree greater or equal to one."));
1172 template<
int dim,
int spacedim>
1176 line_support_points(mapping.line_support_points),
1185 template<
int dim,
int spacedim>
1195 template<
int dim,
int spacedim>
1204 template<
int dim,
int spacedim>
1215 ExcInternalError());
1218 const std::vector<unsigned int>
1220 lexicographic_to_hierarchic_numbering (
1224 const std::vector<Point<spacedim> > support_points
1228 for (
unsigned int i=0; i<tensor_pols.
n(); ++i)
1229 mapped_point += support_points[renumber[i]] * tensor_pols.
compute_value (i, p);
1231 return mapped_point;
1255 template<
int dim,
int spacedim>
1276 do_transform_real_to_unit_cell_internal
1282 const unsigned int spacedim = dim;
1286 Assert(n_shapes!=0, ExcInternalError());
1307 Point<spacedim> p_real = compute_mapped_location_of_point<dim,spacedim>(mdata);
1311 if (f.norm_square() < 1e-24 * cell->diameter() * cell->diameter())
1347 const double eps = 1.e-11;
1348 const unsigned int newton_iteration_limit = 20;
1350 unsigned int newton_iteration = 0;
1351 double last_f_weighted_norm;
1354 #ifdef DEBUG_TRANSFORM_REAL_TO_UNIT_CELL 1355 std::cout <<
"Newton iteration " << newton_iteration << std::endl;
1365 for (
unsigned int i=0; i<spacedim; ++i)
1366 for (
unsigned int j=0; j<dim; ++j)
1367 df[i][j]+=point[i]*grad_transform[j];
1374 #ifdef DEBUG_TRANSFORM_REAL_TO_UNIT_CELL 1375 std::cout <<
" delta=" << delta << std::endl;
1379 double step_length = 1;
1387 for (
unsigned int i=0; i<dim; ++i)
1388 p_unit_trial[i] -= step_length * delta[i];
1395 Point<spacedim> p_real_trial = compute_mapped_location_of_point<dim,spacedim>(mdata);
1398 #ifdef DEBUG_TRANSFORM_REAL_TO_UNIT_CELL 1399 std::cout <<
" step_length=" << step_length << std::endl
1400 <<
" ||f || =" << f.
norm() << std::endl
1401 <<
" ||f*|| =" << f_trial.norm() << std::endl
1402 <<
" ||f*||_A =" << (df_inverse * f_trial).norm() << std::endl;
1412 if (f_trial.norm() < f.norm())
1414 p_real = p_real_trial;
1415 p_unit = p_unit_trial;
1419 else if (step_length > 0.05)
1428 if (newton_iteration > newton_iteration_limit)
1431 last_f_weighted_norm = (df_inverse * f).norm();
1433 while (last_f_weighted_norm > eps);
1445 do_transform_real_to_unit_cell_internal_codim1
1451 const unsigned int spacedim = dim+1;
1455 Assert(n_shapes!=0, ExcInternalError());
1460 Assert(points.size()==n_shapes, ExcInternalError());
1480 for (
unsigned int j=0; j<dim; ++j)
1482 DF[j] += grad_phi_k[j] * point_k;
1483 for (
unsigned int l=0; l<dim; ++l)
1484 D2F[j][l] += hessian_k[j][l] * point_k;
1489 p_minus_F -= compute_mapped_location_of_point<dim,spacedim>(mdata);
1492 for (
unsigned int j=0; j<dim; ++j)
1493 f[j] = DF[j] * p_minus_F;
1495 for (
unsigned int j=0; j<dim; ++j)
1497 f[j] = DF[j] * p_minus_F;
1498 for (
unsigned int l=0; l<dim; ++l)
1499 df[j][l] = -DF[j]*DF[l] + D2F[j][l] * p_minus_F;
1503 const double eps = 1.e-12*cell->diameter();
1504 const unsigned int loop_limit = 10;
1506 unsigned int loop=0;
1508 while (f.
norm()>eps && loop++<loop_limit)
1514 for (
unsigned int j=0; j<dim; ++j)
1517 for (
unsigned int l=0; l<dim; ++l)
1529 for (
unsigned int j=0; j<dim; ++j)
1531 DF[j] += grad_phi_k[j] * point_k;
1532 for (
unsigned int l=0; l<dim; ++l)
1533 D2F[j][l] += hessian_k[j][l] * point_k;
1540 p_minus_F -= compute_mapped_location_of_point<dim,spacedim>(mdata);
1542 for (
unsigned int j=0; j<dim; ++j)
1544 f[j] = DF[j] * p_minus_F;
1545 for (
unsigned int l=0; l<dim; ++l)
1546 df[j][l] = -DF[j]*DF[l] + D2F[j][l] * p_minus_F;
1572 template<
int dim,
int spacedim>
1581 Assert(
false, ExcInternalError());
1591 const Point<1> &initial_p_unit)
const 1594 const int spacedim = 1;
1601 std_cxx11::unique_ptr<InternalData> mdata (
get_data(update_flags,
1608 return do_transform_real_to_unit_cell_internal<1>(cell, p, initial_p_unit, *mdata);
1617 const Point<2> &initial_p_unit)
const 1620 const int spacedim = 2;
1627 std_cxx11::unique_ptr<InternalData> mdata (
get_data(update_flags,
1634 return do_transform_real_to_unit_cell_internal<2>(cell, p, initial_p_unit, *mdata);
1643 const Point<3> &initial_p_unit)
const 1646 const int spacedim = 3;
1653 std_cxx11::unique_ptr<InternalData> mdata (
get_data(update_flags,
1660 return do_transform_real_to_unit_cell_internal<3>(cell, p, initial_p_unit, *mdata);
1669 const Point<1> &initial_p_unit)
const 1672 const int spacedim = 2;
1679 std_cxx11::unique_ptr<InternalData> mdata (
get_data(update_flags,
1686 return do_transform_real_to_unit_cell_internal_codim1<1>(cell, p, initial_p_unit, *mdata);
1695 const Point<2> &initial_p_unit)
const 1698 const int spacedim = 3;
1705 std_cxx11::unique_ptr<InternalData> mdata (
get_data(update_flags,
1712 return do_transform_real_to_unit_cell_internal_codim1<2>(cell, p, initial_p_unit, *mdata);
1723 Assert (
false, ExcNotImplemented());
1729 template<
int dim,
int spacedim>
1740 ((dim == 2) && (dim == spacedim))))
1773 return internal::MappingQ1::transform_real_to_unit_cell(vertices, p);
1776 const std::vector<Point<spacedim> > a (vertices.begin(),
1778 return internal::MappingQ1::transform_real_to_unit_cell_initial_guess<dim,spacedim>(a,p);
1785 = internal::MappingQ1::transform_real_to_unit_cell(vertices, p);
1790 const double eps = 1e-15;
1791 if (-eps <= point(1) && point(1) <= 1 + eps &&
1792 -eps <= point(0) && point(0) <= 1 + eps)
1803 Assert(
false, ExcInternalError());
1824 const std::vector<Point<spacedim> > a
1827 ExcInternalError());
1828 initial_p_unit = internal::MappingQ1::transform_real_to_unit_cell_initial_guess<dim,spacedim>(a,p);
1841 std::vector<Point<spacedim> > a
1844 initial_p_unit = internal::MappingQ1::transform_real_to_unit_cell_initial_guess<dim,spacedim>(a,p);
1848 for (
unsigned int d=0; d<dim; ++d)
1849 initial_p_unit[d] = 0.5;
1870 template<
int dim,
int spacedim>
1881 for (
unsigned int i=0; i<5; ++i)
1930 template<
int dim,
int spacedim>
1943 template<
int dim,
int spacedim>
1958 template<
int dim,
int spacedim>
1983 template <
int dim,
int spacedim>
1986 const typename ::MappingQGeneric<dim,spacedim>::InternalData &data,
1989 const UpdateFlags update_flags = data.update_each;
1993 for (
unsigned int point=0; point<quadrature_points.size(); ++point)
1995 const double *shape = &data.shape(point+data_set,0);
1997 data.mapping_support_points[0]);
1998 for (
unsigned int k=1; k<data.n_shape_functions; ++k)
1999 for (
unsigned int i=0; i<spacedim; ++i)
2000 result[i] += shape[k] * data.mapping_support_points[k][i];
2001 quadrature_points[point] = result;
2014 template <
int dim,
int spacedim>
2016 maybe_update_Jacobians (
const CellSimilarity::Similarity cell_similarity,
2017 const typename ::QProjector<dim>::DataSetDescriptor data_set,
2018 const typename ::MappingQGeneric<dim,spacedim>::InternalData &data)
2020 const UpdateFlags update_flags = data.update_each;
2026 if (cell_similarity != CellSimilarity::translation)
2028 const unsigned int n_q_points = data.contravariant.size();
2030 std::fill(data.contravariant.begin(), data.contravariant.end(),
2033 Assert (data.n_shape_functions > 0, ExcInternalError());
2035 &data.mapping_support_points[0];
2037 for (
unsigned int point=0; point<n_q_points; ++point)
2040 &data.derivative(point+data_set, 0);
2042 double result [spacedim][dim];
2046 for (
unsigned int i=0; i<spacedim; ++i)
2047 for (
unsigned int j=0; j<dim; ++j)
2048 result[i][j] = data_derv[0][j] * supp_pts[0][i];
2049 for (
unsigned int k=1; k<data.n_shape_functions; ++k)
2050 for (
unsigned int i=0; i<spacedim; ++i)
2051 for (
unsigned int j=0; j<dim; ++j)
2052 result[i][j] += data_derv[k][j] * supp_pts[k][i];
2059 for (
unsigned int i=0; i<spacedim; ++i)
2060 for (
unsigned int j=0; j<dim; ++j)
2061 data.contravariant[point][i][j] = result[i][j];
2066 if (cell_similarity != CellSimilarity::translation)
2068 const unsigned int n_q_points = data.contravariant.size();
2069 for (
unsigned int point=0; point<n_q_points; ++point)
2071 data.covariant[point] = (data.contravariant[point]).covariant_form();
2076 if (cell_similarity != CellSimilarity::translation)
2078 const unsigned int n_q_points = data.contravariant.size();
2079 for (
unsigned int point=0; point<n_q_points; ++point)
2080 data.volume_elements[point] = data.contravariant[point].
determinant();
2091 template <
int dim,
int spacedim>
2093 maybe_update_jacobian_grads (
const CellSimilarity::Similarity cell_similarity,
2095 const typename ::MappingQGeneric<dim,spacedim>::InternalData &data,
2098 const UpdateFlags update_flags = data.update_each;
2101 const unsigned int n_q_points = jacobian_grads.size();
2103 if (cell_similarity != CellSimilarity::translation)
2105 for (
unsigned int point=0; point<n_q_points; ++point)
2108 &data.second_derivative(point+data_set, 0);
2109 double result [spacedim][dim][dim];
2110 for (
unsigned int i=0; i<spacedim; ++i)
2111 for (
unsigned int j=0; j<dim; ++j)
2112 for (
unsigned int l=0; l<dim; ++l)
2113 result[i][j][l] = (second[0][j][l] *
2114 data.mapping_support_points[0][i]);
2115 for (
unsigned int k=1; k<data.n_shape_functions; ++k)
2116 for (
unsigned int i=0; i<spacedim; ++i)
2117 for (
unsigned int j=0; j<dim; ++j)
2118 for (
unsigned int l=0; l<dim; ++l)
2122 data.mapping_support_points[k][i]);
2124 for (
unsigned int i=0; i<spacedim; ++i)
2125 for (
unsigned int j=0; j<dim; ++j)
2126 for (
unsigned int l=0; l<dim; ++l)
2127 jacobian_grads[point][i][j][l] = result[i][j][l];
2139 template <
int dim,
int spacedim>
2141 maybe_update_jacobian_pushed_forward_grads (
const CellSimilarity::Similarity cell_similarity,
2143 const typename ::MappingQGeneric<dim,spacedim>::InternalData &data,
2146 const UpdateFlags update_flags = data.update_each;
2149 const unsigned int n_q_points = jacobian_pushed_forward_grads.size();
2151 if (cell_similarity != CellSimilarity::translation)
2153 double tmp[spacedim][spacedim][spacedim];
2154 for (
unsigned int point=0; point<n_q_points; ++point)
2157 &data.second_derivative(point+data_set, 0);
2158 double result [spacedim][dim][dim];
2159 for (
unsigned int i=0; i<spacedim; ++i)
2160 for (
unsigned int j=0; j<dim; ++j)
2161 for (
unsigned int l=0; l<dim; ++l)
2162 result[i][j][l] = (second[0][j][l] *
2163 data.mapping_support_points[0][i]);
2164 for (
unsigned int k=1; k<data.n_shape_functions; ++k)
2165 for (
unsigned int i=0; i<spacedim; ++i)
2166 for (
unsigned int j=0; j<dim; ++j)
2167 for (
unsigned int l=0; l<dim; ++l)
2171 data.mapping_support_points[k][i]);
2174 for (
unsigned int i=0; i<spacedim; ++i)
2175 for (
unsigned int j=0; j<spacedim; ++j)
2176 for (
unsigned int l=0; l<dim; ++l)
2178 tmp[i][j][l] = result[i][0][l] *
2179 data.covariant[point][j][0];
2180 for (
unsigned int jr=1; jr<dim; ++jr)
2182 tmp[i][j][l] += result[i][jr][l] *
2183 data.covariant[point][j][jr];
2188 for (
unsigned int i=0; i<spacedim; ++i)
2189 for (
unsigned int j=0; j<spacedim; ++j)
2190 for (
unsigned int l=0; l<spacedim; ++l)
2192 jacobian_pushed_forward_grads[point][i][j][l] = tmp[i][j][0] *
2193 data.covariant[point][l][0];
2194 for (
unsigned int lr=1; lr<dim; ++lr)
2196 jacobian_pushed_forward_grads[point][i][j][l] += tmp[i][j][lr] *
2197 data.covariant[point][l][lr];
2212 template <
int dim,
int spacedim>
2214 maybe_update_jacobian_2nd_derivatives (
const CellSimilarity::Similarity cell_similarity,
2216 const typename ::MappingQGeneric<dim,spacedim>::InternalData &data,
2219 const UpdateFlags update_flags = data.update_each;
2222 const unsigned int n_q_points = jacobian_2nd_derivatives.size();
2224 if (cell_similarity != CellSimilarity::translation)
2226 for (
unsigned int point=0; point<n_q_points; ++point)
2229 &data.third_derivative(point+data_set, 0);
2230 double result [spacedim][dim][dim][dim];
2231 for (
unsigned int i=0; i<spacedim; ++i)
2232 for (
unsigned int j=0; j<dim; ++j)
2233 for (
unsigned int l=0; l<dim; ++l)
2234 for (
unsigned int m=0; m<dim; ++m)
2235 result[i][j][l][m] = (third[0][j][l][m] *
2236 data.mapping_support_points[0][i]);
2237 for (
unsigned int k=1; k<data.n_shape_functions; ++k)
2238 for (
unsigned int i=0; i<spacedim; ++i)
2239 for (
unsigned int j=0; j<dim; ++j)
2240 for (
unsigned int l=0; l<dim; ++l)
2241 for (
unsigned int m=0; m<dim; ++m)
2243 += (third[k][j][l][m]
2245 data.mapping_support_points[k][i]);
2247 for (
unsigned int i=0; i<spacedim; ++i)
2248 for (
unsigned int j=0; j<dim; ++j)
2249 for (
unsigned int l=0; l<dim; ++l)
2250 for (
unsigned int m=0; m<dim; ++m)
2251 jacobian_2nd_derivatives[point][i][j][l][m] = result[i][j][l][m];
2264 template <
int dim,
int spacedim>
2266 maybe_update_jacobian_pushed_forward_2nd_derivatives (
const CellSimilarity::Similarity cell_similarity,
2268 const typename ::MappingQGeneric<dim,spacedim>::InternalData &data,
2271 const UpdateFlags update_flags = data.update_each;
2274 const unsigned int n_q_points = jacobian_pushed_forward_2nd_derivatives.size();
2276 if (cell_similarity != CellSimilarity::translation)
2278 double tmp[spacedim][spacedim][spacedim][spacedim];
2279 for (
unsigned int point=0; point<n_q_points; ++point)
2282 &data.third_derivative(point+data_set, 0);
2283 double result [spacedim][dim][dim][dim];
2284 for (
unsigned int i=0; i<spacedim; ++i)
2285 for (
unsigned int j=0; j<dim; ++j)
2286 for (
unsigned int l=0; l<dim; ++l)
2287 for (
unsigned int m=0; m<dim; ++m)
2288 result[i][j][l][m] = (third[0][j][l][m] *
2289 data.mapping_support_points[0][i]);
2290 for (
unsigned int k=1; k<data.n_shape_functions; ++k)
2291 for (
unsigned int i=0; i<spacedim; ++i)
2292 for (
unsigned int j=0; j<dim; ++j)
2293 for (
unsigned int l=0; l<dim; ++l)
2294 for (
unsigned int m=0; m<dim; ++m)
2296 += (third[k][j][l][m]
2298 data.mapping_support_points[k][i]);
2301 for (
unsigned int i=0; i<spacedim; ++i)
2302 for (
unsigned int j=0; j<spacedim; ++j)
2303 for (
unsigned int l=0; l<dim; ++l)
2304 for (
unsigned int m=0; m<dim; ++m)
2306 jacobian_pushed_forward_2nd_derivatives[point][i][j][l][m]
2307 = result[i][0][l][m]*
2308 data.covariant[point][j][0];
2309 for (
unsigned int jr=1; jr<dim; ++jr)
2310 jacobian_pushed_forward_2nd_derivatives[point][i][j][l][m]
2311 += result[i][jr][l][m]*
2312 data.covariant[point][j][jr];
2316 for (
unsigned int i=0; i<spacedim; ++i)
2317 for (
unsigned int j=0; j<spacedim; ++j)
2318 for (
unsigned int l=0; l<spacedim; ++l)
2319 for (
unsigned int m=0; m<dim; ++m)
2322 = jacobian_pushed_forward_2nd_derivatives[point][i][j][0][m]*
2323 data.covariant[point][l][0];
2324 for (
unsigned int lr=1; lr<dim; ++lr)
2326 += jacobian_pushed_forward_2nd_derivatives[point][i][j][lr][m]*
2327 data.covariant[point][l][lr];
2331 for (
unsigned int i=0; i<spacedim; ++i)
2332 for (
unsigned int j=0; j<spacedim; ++j)
2333 for (
unsigned int l=0; l<spacedim; ++l)
2334 for (
unsigned int m=0; m<spacedim; ++m)
2336 jacobian_pushed_forward_2nd_derivatives[point][i][j][l][m]
2338 data.covariant[point][m][0];
2339 for (
unsigned int mr=1; mr<dim; ++mr)
2340 jacobian_pushed_forward_2nd_derivatives[point][i][j][l][m]
2341 += tmp[i][j][l][mr]*
2342 data.covariant[point][m][mr];
2355 template <
int dim,
int spacedim>
2357 maybe_update_jacobian_3rd_derivatives (
const CellSimilarity::Similarity cell_similarity,
2359 const typename ::MappingQGeneric<dim,spacedim>::InternalData &data,
2362 const UpdateFlags update_flags = data.update_each;
2365 const unsigned int n_q_points = jacobian_3rd_derivatives.size();
2367 if (cell_similarity != CellSimilarity::translation)
2369 for (
unsigned int point=0; point<n_q_points; ++point)
2372 &data.fourth_derivative(point+data_set, 0);
2373 double result [spacedim][dim][dim][dim][dim];
2374 for (
unsigned int i=0; i<spacedim; ++i)
2375 for (
unsigned int j=0; j<dim; ++j)
2376 for (
unsigned int l=0; l<dim; ++l)
2377 for (
unsigned int m=0; m<dim; ++m)
2378 for (
unsigned int n=0; n<dim; ++n)
2379 result[i][j][l][m][n] = (fourth[0][j][l][m][n] *
2380 data.mapping_support_points[0][i]);
2381 for (
unsigned int k=1; k<data.n_shape_functions; ++k)
2382 for (
unsigned int i=0; i<spacedim; ++i)
2383 for (
unsigned int j=0; j<dim; ++j)
2384 for (
unsigned int l=0; l<dim; ++l)
2385 for (
unsigned int m=0; m<dim; ++m)
2386 for (
unsigned int n=0; n<dim; ++n)
2387 result[i][j][l][m][n]
2388 += (fourth[k][j][l][m][n]
2390 data.mapping_support_points[k][i]);
2392 for (
unsigned int i=0; i<spacedim; ++i)
2393 for (
unsigned int j=0; j<dim; ++j)
2394 for (
unsigned int l=0; l<dim; ++l)
2395 for (
unsigned int m=0; m<dim; ++m)
2396 for (
unsigned int n=0; n<dim; ++n)
2397 jacobian_3rd_derivatives[point][i][j][l][m][n] = result[i][j][l][m][n];
2409 template <
int dim,
int spacedim>
2411 maybe_update_jacobian_pushed_forward_3rd_derivatives (
const CellSimilarity::Similarity cell_similarity,
2413 const typename ::MappingQGeneric<dim,spacedim>::InternalData &data,
2416 const UpdateFlags update_flags = data.update_each;
2419 const unsigned int n_q_points = jacobian_pushed_forward_3rd_derivatives.size();
2421 if (cell_similarity != CellSimilarity::translation)
2423 double tmp[spacedim][spacedim][spacedim][spacedim][spacedim];
2424 for (
unsigned int point=0; point<n_q_points; ++point)
2427 &data.fourth_derivative(point+data_set, 0);
2428 double result [spacedim][dim][dim][dim][dim];
2429 for (
unsigned int i=0; i<spacedim; ++i)
2430 for (
unsigned int j=0; j<dim; ++j)
2431 for (
unsigned int l=0; l<dim; ++l)
2432 for (
unsigned int m=0; m<dim; ++m)
2433 for (
unsigned int n=0; n<dim; ++n)
2434 result[i][j][l][m][n] = (fourth[0][j][l][m][n] *
2435 data.mapping_support_points[0][i]);
2436 for (
unsigned int k=1; k<data.n_shape_functions; ++k)
2437 for (
unsigned int i=0; i<spacedim; ++i)
2438 for (
unsigned int j=0; j<dim; ++j)
2439 for (
unsigned int l=0; l<dim; ++l)
2440 for (
unsigned int m=0; m<dim; ++m)
2441 for (
unsigned int n=0; n<dim; ++n)
2442 result[i][j][l][m][n]
2443 += (fourth[k][j][l][m][n]
2445 data.mapping_support_points[k][i]);
2448 for (
unsigned int i=0; i<spacedim; ++i)
2449 for (
unsigned int j=0; j<spacedim; ++j)
2450 for (
unsigned int l=0; l<dim; ++l)
2451 for (
unsigned int m=0; m<dim; ++m)
2452 for (
unsigned int n=0; n<dim; ++n)
2454 tmp[i][j][l][m][n] = result[i][0][l][m][n] *
2455 data.covariant[point][j][0];
2456 for (
unsigned int jr=1; jr<dim; ++jr)
2457 tmp[i][j][l][m][n] += result[i][jr][l][m][n] *
2458 data.covariant[point][j][jr];
2462 for (
unsigned int i=0; i<spacedim; ++i)
2463 for (
unsigned int j=0; j<spacedim; ++j)
2464 for (
unsigned int l=0; l<spacedim; ++l)
2465 for (
unsigned int m=0; m<dim; ++m)
2466 for (
unsigned int n=0; n<dim; ++n)
2468 jacobian_pushed_forward_3rd_derivatives[point][i][j][l][m][n]
2469 = tmp[i][j][0][m][n] *
2470 data.covariant[point][l][0];
2471 for (
unsigned int lr=1; lr<dim; ++lr)
2472 jacobian_pushed_forward_3rd_derivatives[point][i][j][l][m][n]
2473 += tmp[i][j][lr][m][n] *
2474 data.covariant[point][l][lr];
2478 for (
unsigned int i=0; i<spacedim; ++i)
2479 for (
unsigned int j=0; j<spacedim; ++j)
2480 for (
unsigned int l=0; l<spacedim; ++l)
2481 for (
unsigned int m=0; m<spacedim; ++m)
2482 for (
unsigned int n=0; n<dim; ++n)
2485 = jacobian_pushed_forward_3rd_derivatives[point][i][j][l][0][n] *
2486 data.covariant[point][m][0];
2487 for (
unsigned int mr=1; mr<dim; ++mr)
2489 += jacobian_pushed_forward_3rd_derivatives[point][i][j][l][mr][n] *
2490 data.covariant[point][m][mr];
2494 for (
unsigned int i=0; i<spacedim; ++i)
2495 for (
unsigned int j=0; j<spacedim; ++j)
2496 for (
unsigned int l=0; l<spacedim; ++l)
2497 for (
unsigned int m=0; m<spacedim; ++m)
2498 for (
unsigned int n=0; n<spacedim; ++n)
2500 jacobian_pushed_forward_3rd_derivatives[point][i][j][l][m][n]
2501 = tmp[i][j][l][m][0] *
2502 data.covariant[point][n][0];
2503 for (
unsigned int nr=1; nr<dim; ++nr)
2504 jacobian_pushed_forward_3rd_derivatives[point][i][j][l][m][n]
2505 += tmp[i][j][l][m][nr] *
2506 data.covariant[point][n][nr];
2518 template<
int dim,
int spacedim>
2519 CellSimilarity::Similarity
2522 const CellSimilarity::Similarity cell_similarity,
2528 Assert (dynamic_cast<const InternalData *>(&internal_data) != 0,
2529 ExcInternalError());
2532 const unsigned int n_q_points=quadrature.
size();
2540 (&cell->get_triangulation() !=
2552 internal::maybe_update_Jacobians<dim,spacedim> (cell_similarity,
2556 const UpdateFlags update_flags = data.update_each;
2557 const std::vector<double> &weights=quadrature.
get_weights();
2569 ExcDimensionMismatch(output_data.
normal_vectors.size(), n_q_points));
2572 if (cell_similarity != CellSimilarity::translation)
2573 for (
unsigned int point=0; point<n_q_points; ++point)
2576 if (dim == spacedim)
2578 const double det = data.contravariant[point].determinant();
2585 Assert (det > 1e-12*Utilities::fixed_power<dim>(cell->diameter()/
2586 std::sqrt(
double(dim))),
2589 output_data.
JxW_values[point] = weights[point] * det;
2597 for (
unsigned int i=0; i<spacedim; ++i)
2598 for (
unsigned int j=0; j<dim; ++j)
2599 DX_t[j][i] = data.contravariant[point][i][j];
2602 for (
unsigned int i=0; i<dim; ++i)
2603 for (
unsigned int j=0; j<dim; ++j)
2604 G[i][j] = DX_t[i] * DX_t[j];
2607 = sqrt(determinant(G)) * weights[point];
2609 if (cell_similarity == CellSimilarity::inverted_translation)
2612 if (update_flags & update_normal_vectors)
2617 const unsigned int codim = spacedim-dim;
2620 if (update_flags & update_normal_vectors)
2626 cross_product_2d(-DX_t[0]);
2629 cross_product_3d(DX_t[0], DX_t[1]);
2633 if (cell->direction_flag() ==
false)
2649 if (cell_similarity != CellSimilarity::translation)
2650 for (
unsigned int point=0; point<n_q_points; ++point)
2651 output_data.
jacobians[point] = data.contravariant[point];
2658 if (cell_similarity != CellSimilarity::translation)
2659 for (
unsigned int point=0; point<n_q_points; ++point)
2663 internal::maybe_update_jacobian_grads<dim,spacedim> (cell_similarity,
2668 internal::maybe_update_jacobian_pushed_forward_grads<dim,spacedim> (cell_similarity,
2673 internal::maybe_update_jacobian_2nd_derivatives<dim,spacedim> (cell_similarity,
2678 internal::maybe_update_jacobian_pushed_forward_2nd_derivatives<dim,spacedim> (cell_similarity,
2683 internal::maybe_update_jacobian_3rd_derivatives<dim,spacedim> (cell_similarity,
2688 internal::maybe_update_jacobian_pushed_forward_3rd_derivatives<dim,spacedim> (cell_similarity,
2693 return cell_similarity;
2714 template <
int dim,
int spacedim>
2716 maybe_compute_face_data (const ::MappingQGeneric<dim,spacedim> &mapping,
2717 const typename ::Triangulation<dim,spacedim>::cell_iterator &cell,
2718 const unsigned int face_no,
2719 const unsigned int subface_no,
2720 const unsigned int n_q_points,
2721 const std::vector<double> &weights,
2722 const typename ::MappingQGeneric<dim,spacedim>::InternalData &data,
2725 const UpdateFlags update_flags = data.update_each;
2738 for (
unsigned int d=0; d!=dim-1; ++d)
2741 data.unit_tangentials.size(),
2742 ExcInternalError());
2743 Assert (data.aux[d].size() <=
2745 ExcInternalError());
2750 make_array_view(data.aux[d]));
2755 if (dim == spacedim)
2757 for (
unsigned int i=0; i<n_q_points; ++i)
2770 cross_product_2d(data.aux[0][i]);
2774 cross_product_3d(data.aux[0][i], data.aux[1][i]);
2777 Assert(
false, ExcNotImplemented());
2790 for (
unsigned int point=0; point<n_q_points; ++point)
2795 output_data.
boundary_forms[point] = data.contravariant[point].transpose()[0];
2797 (face_no == 0 ? -1. : +1.) * output_data.
boundary_forms[point].norm();
2806 cross_product_3d(DX_t[0], DX_t[1]);
2807 cell_normal /= cell_normal.
norm();
2812 cross_product_3d(data.aux[0][point], cell_normal);
2817 if (update_flags & (update_normal_vectors
2818 | update_JxW_values))
2821 if (update_flags & update_JxW_values)
2828 cell->subface_case(face_no), subface_no);
2833 if (update_flags & update_normal_vectors)
2839 for (
unsigned int point=0; point<n_q_points; ++point)
2840 output_data.
jacobians[point] = data.contravariant[point];
2843 for (
unsigned int point=0; point<n_q_points; ++point)
2855 template<
int dim,
int spacedim>
2857 do_fill_fe_face_values (const ::MappingQGeneric<dim,spacedim> &mapping,
2858 const typename ::Triangulation<dim,spacedim>::cell_iterator &cell,
2859 const unsigned int face_no,
2860 const unsigned int subface_no,
2863 const typename ::MappingQGeneric<dim,spacedim>::InternalData &data,
2866 maybe_compute_q_points<dim,spacedim> (data_set,
2869 maybe_update_Jacobians<dim,spacedim> (CellSimilarity::none,
2872 maybe_update_jacobian_grads<dim,spacedim> (CellSimilarity::none,
2876 maybe_update_jacobian_pushed_forward_grads<dim,spacedim> (CellSimilarity::none,
2880 maybe_update_jacobian_2nd_derivatives<dim,spacedim> (CellSimilarity::none,
2884 maybe_update_jacobian_pushed_forward_2nd_derivatives<dim,spacedim> (CellSimilarity::none,
2888 maybe_update_jacobian_3rd_derivatives<dim,spacedim> (CellSimilarity::none,
2892 maybe_update_jacobian_pushed_forward_3rd_derivatives<dim,spacedim> (CellSimilarity::none,
2897 maybe_compute_face_data (mapping,
2898 cell, face_no, subface_no, quadrature.
size(),
2907 template<
int dim,
int spacedim>
2911 const unsigned int face_no,
2917 Assert ((dynamic_cast<const InternalData *>(&internal_data) != 0),
2918 ExcInternalError());
2928 (&cell->get_triangulation() !=
2940 cell->face_orientation(face_no),
2941 cell->face_flip(face_no),
2942 cell->face_rotation(face_no),
2951 template<
int dim,
int spacedim>
2955 const unsigned int face_no,
2956 const unsigned int subface_no,
2962 Assert ((dynamic_cast<const InternalData *>(&internal_data) != 0),
2963 ExcInternalError());
2973 (&cell->get_triangulation() !=
2983 cell, face_no, subface_no,
2985 cell->face_orientation(face_no),
2986 cell->face_flip(face_no),
2987 cell->face_rotation(face_no),
2989 cell->subface_case(face_no)),
2999 template <
int dim,
int spacedim,
int rank>
3008 ExcInternalError());
3012 switch (mapping_type)
3019 for (
unsigned int i=0; i<output.size(); ++i)
3020 output[i] = apply_transformation(data.
contravariant[i], input[i]);
3035 for (
unsigned int i=0; i<output.size(); ++i)
3037 output[i] = apply_transformation(data.
contravariant[i], input[i]);
3050 for (
unsigned int i=0; i<output.size(); ++i)
3051 output[i] = apply_transformation(data.
covariant[i], input[i]);
3057 Assert(
false, ExcNotImplemented());
3062 template <
int dim,
int spacedim,
int rank>
3071 ExcInternalError());
3075 switch (mapping_type)
3085 for (
unsigned int i=0; i<output.size(); ++i)
3088 apply_transformation(data.
contravariant[i], transpose(input[i]) );
3101 for (
unsigned int i=0; i<output.size(); ++i)
3104 apply_transformation(data.
covariant[i], transpose(input[i]) );
3121 for (
unsigned int i=0; i<output.size(); ++i)
3124 apply_transformation(data.
covariant[i], input[i] );
3128 output[i] = transpose(T);
3136 Assert(
false, ExcNotImplemented());
3143 template <
int dim,
int spacedim>
3152 ExcInternalError());
3156 switch (mapping_type)
3165 for (
unsigned int q=0; q<output.size(); ++q)
3166 for (
unsigned int i=0; i<spacedim; ++i)
3168 double tmp1[dim][dim];
3169 for (
unsigned int J=0; J<dim; ++J)
3170 for (
unsigned int K=0; K<dim; ++K)
3172 tmp1[J][K] = data.
contravariant[q][i][0] * input[q][0][J][K];
3173 for (
unsigned int I=1; I<dim; ++I)
3174 tmp1[J][K] += data.
contravariant[q][i][I] * input[q][I][J][K];
3176 for (
unsigned int j=0; j<spacedim; ++j)
3179 for (
unsigned int K=0; K<dim; ++K)
3181 tmp2[K] = data.
covariant[q][j][0] * tmp1[0][K];
3182 for (
unsigned int J=1; J<dim; ++J)
3183 tmp2[K] += data.
covariant[q][j][J] * tmp1[J][K];
3185 for (
unsigned int k=0; k<spacedim; ++k)
3187 output[q][i][j][k] = data.
covariant[q][k][0] * tmp2[0];
3188 for (
unsigned int K=1; K<dim; ++K)
3189 output[q][i][j][k] += data.
covariant[q][k][K] * tmp2[K];
3201 for (
unsigned int q=0; q<output.size(); ++q)
3202 for (
unsigned int i=0; i<spacedim; ++i)
3204 double tmp1[dim][dim];
3205 for (
unsigned int J=0; J<dim; ++J)
3206 for (
unsigned int K=0; K<dim; ++K)
3208 tmp1[J][K] = data.
covariant[q][i][0] * input[q][0][J][K];
3209 for (
unsigned int I=1; I<dim; ++I)
3210 tmp1[J][K] += data.
covariant[q][i][I] * input[q][I][J][K];
3212 for (
unsigned int j=0; j<spacedim; ++j)
3215 for (
unsigned int K=0; K<dim; ++K)
3217 tmp2[K] = data.
covariant[q][j][0] * tmp1[0][K];
3218 for (
unsigned int J=1; J<dim; ++J)
3219 tmp2[K] += data.
covariant[q][j][J] * tmp1[J][K];
3221 for (
unsigned int k=0; k<spacedim; ++k)
3223 output[q][i][j][k] = data.
covariant[q][k][0] * tmp2[0];
3224 for (
unsigned int K=1; K<dim; ++K)
3225 output[q][i][j][k] += data.
covariant[q][k][K] * tmp2[K];
3242 for (
unsigned int q=0; q<output.size(); ++q)
3243 for (
unsigned int i=0; i<spacedim; ++i)
3246 for (
unsigned int I=0; I<dim; ++I)
3248 double tmp1[dim][dim];
3249 for (
unsigned int J=0; J<dim; ++J)
3250 for (
unsigned int K=0; K<dim; ++K)
3252 tmp1[J][K] = factor[0] * input[q][0][J][K];
3253 for (
unsigned int I=1; I<dim; ++I)
3254 tmp1[J][K] += factor[I] * input[q][I][J][K];
3256 for (
unsigned int j=0; j<spacedim; ++j)
3259 for (
unsigned int K=0; K<dim; ++K)
3261 tmp2[K] = data.
covariant[q][j][0] * tmp1[0][K];
3262 for (
unsigned int J=1; J<dim; ++J)
3263 tmp2[K] += data.
covariant[q][j][J] * tmp1[J][K];
3265 for (
unsigned int k=0; k<spacedim; ++k)
3267 output[q][i][j][k] = data.
covariant[q][k][0] * tmp2[0];
3268 for (
unsigned int K=1; K<dim; ++K)
3269 output[q][i][j][k] += data.
covariant[q][k][K] * tmp2[K];
3278 Assert(
false, ExcNotImplemented());
3285 template<
int dim,
int spacedim,
int rank>
3294 ExcInternalError());
3298 switch (mapping_type)
3305 for (
unsigned int i=0; i<output.size(); ++i)
3306 output[i] = apply_transformation(data.
covariant[i], input[i]);
3311 Assert(
false, ExcNotImplemented());
3318 template<
int dim,
int spacedim>
3326 transform_fields(input, mapping_type, mapping_data, output);
3331 template<
int dim,
int spacedim>
3339 transform_differential_forms(input, mapping_type, mapping_data, output);
3344 template<
int dim,
int spacedim>
3352 switch (mapping_type)
3355 transform_fields(input, mapping_type, mapping_data, output);
3361 transform_gradients(input, mapping_type, mapping_data, output);
3364 Assert(
false, ExcNotImplemented());
3370 template<
int dim,
int spacedim>
3380 Assert (dynamic_cast<const InternalData *>(&mapping_data) != 0,
3381 ExcInternalError());
3384 switch (mapping_type)
3391 for (
unsigned int q=0; q<output.size(); ++q)
3392 for (
unsigned int i=0; i<spacedim; ++i)
3393 for (
unsigned int j=0; j<spacedim; ++j)
3396 for (
unsigned int K=0; K<dim; ++K)
3398 tmp[K] = data.
covariant[q][j][0] * input[q][i][0][K];
3399 for (
unsigned int J=1; J<dim; ++J)
3400 tmp[K] += data.
covariant[q][j][J] * input[q][i][J][K];
3402 for (
unsigned int k=0; k<spacedim; ++k)
3404 output[q][i][j][k] = data.
covariant[q][k][0] * tmp[0];
3405 for (
unsigned int K=1; K<dim; ++K)
3406 output[q][i][j][k] += data.
covariant[q][k][K] * tmp[K];
3413 Assert(
false, ExcNotImplemented());
3419 template<
int dim,
int spacedim>
3427 switch (mapping_type)
3432 transform_hessians(input, mapping_type, mapping_data, output);
3435 Assert(
false, ExcNotImplemented());
3451 template<
int dim,
int spacedim>
3458 Assert(surrounding_points.size() >= 2,
ExcMessage(
"At least 2 surrounding points are required"));
3459 const unsigned int n=points.size();
3461 std::vector<double> w(surrounding_points.size());
3463 switch (surrounding_points.size())
3469 for (
unsigned int i=0; i<n; ++i)
3471 const double x = line_support_points.
point(i+1)[0];
3482 Assert(spacedim >= 2, ExcImpossibleInDim(spacedim));
3484 static_cast<unsigned int>(std::sqrt(static_cast<double>(n)));
3486 Assert(m*m==n, ExcInternalError());
3491 for (
unsigned int i=0; i<m; ++i)
3493 const double y=line_support_points.
point(1+i)[0];
3494 for (
unsigned int j=0; j<m; ++j)
3496 const double x=line_support_points.
point(1+j)[0];
3510 Assert(
false, ExcNotImplemented());
3513 Assert(
false, ExcInternalError());
3529 template <
int dim,
int spacedim,
class TriaIterator>
3535 const unsigned int structdim = TriaIterator::AccessorType::structure_dimension;
3546 const typename Triangulation<dim,spacedim>::line_iterator line = iter;
3547 boundary->get_intermediate_points_on_line(line, points);
3552 const typename Triangulation<dim,spacedim>::quad_iterator quad = iter;
3553 boundary->get_intermediate_points_on_quad(quad, points);
3557 Assert(
false, ExcInternalError());
3564 for (
unsigned int i=0; i<sp.size(); ++i)
3565 sp[i] = iter->vertex(i);
3566 get_intermediate_points(manifold, line_support_points, sp, points);
3581 template <
int spacedim>
3585 const unsigned int n_inner_apply=lvs.n_rows();
3586 const unsigned int n_outer_apply=lvs.n_cols();
3587 Assert(a.size()==n_outer_apply,
3588 ExcDimensionMismatch(a.size(), n_outer_apply));
3593 for (
unsigned int unit_point=0; unit_point<n_inner_apply; ++unit_point)
3595 Assert(lvs.n_cols()==n_outer_apply, ExcInternalError());
3597 for (
unsigned int k=0; k<n_outer_apply; ++k)
3598 p+=lvs[unit_point][k]*a[k];
3606 template <
int dim,
int spacedim>
3615 for (
unsigned int line_no=0; line_no<GeometryInfo<dim>::lines_per_cell; ++line_no)
3617 const typename Triangulation<dim,spacedim>::line_iterator line =
3619 static_cast<typename Triangulation<dim,spacedim>::line_iterator
>(cell) :
3620 cell->line(line_no));
3626 cell->get_manifold()
3639 for (
unsigned int line_no=0; line_no<GeometryInfo<dim>::lines_per_cell; ++line_no)
3641 const typename Triangulation<dim,spacedim>::line_iterator
3644 static_cast<typename Triangulation<dim,spacedim>::line_iterator
>(cell)
3646 cell->line(line_no));
3652 cell->get_manifold() :
3655 get_intermediate_points_on_object (manifold, line_support_points, line, line_points);
3661 if (cell->line_orientation(line_no))
3662 a.insert (a.end(), line_points.begin(), line_points.end());
3664 a.insert (a.end(), line_points.rbegin(), line_points.rend());
3669 a.insert (a.end(), line_points.begin(), line_points.end());
3695 std::vector<Point<3> > vertices(4);
3698 for (
unsigned int face_no=0; face_no<faces_per_cell; ++face_no)
3703 const bool face_orientation = cell->face_orientation(face_no),
3704 face_flip = cell->face_flip (face_no),
3705 face_rotation = cell->face_rotation (face_no);
3709 for (
unsigned int i=0; i<vertices_per_face; ++i)
3710 Assert(face->vertex_index(i)==cell->vertex_index(
3715 ExcInternalError());
3719 for (
unsigned int i=0; i<lines_per_face; ++i)
3721 face_no, i, face_orientation, face_flip, face_rotation)),
3722 ExcInternalError());
3727 if (face->at_boundary())
3729 get_intermediate_points_on_object(face->get_manifold(), line_support_points, face, quad_points);
3735 for (
unsigned int i=0; i<quad_points.size(); ++i)
3736 a.push_back(quad_points[
fe_q->adjust_quad_dof_index_for_face_orientation(i,
3745 unsigned int lines_at_boundary=0;
3746 for (
unsigned int i=0; i<lines_per_face; ++i)
3747 if (face->line(i)->at_boundary())
3748 ++lines_at_boundary;
3750 Assert(lines_at_boundary<=lines_per_face, ExcInternalError());
3754 if (lines_at_boundary>0)
3763 ExcDimensionMismatch(b.size(),
3770 for (
unsigned int i=0; i<vertices_per_face; ++i)
3773 for (
unsigned int i=0; i<lines_per_face; ++i)
3775 b[vertices_per_face+i*(polynomial_degree-1)+j]=
3777 face_no, i)*(polynomial_degree-1)+j];
3783 4*this->polynomial_degree +
3784 (this->polynomial_degree-1)*(this->polynomial_degree-1));
3786 for (
unsigned int i=0; i<(polynomial_degree-1)*(polynomial_degree-1); ++i)
3787 a.push_back(b[4*polynomial_degree+i]);
3794 for (
unsigned int i=0; i<4; ++i)
3795 vertices[i] = face->vertex(i);
3796 get_intermediate_points (face->get_manifold(), line_support_points, vertices, quad_points);
3802 for (
unsigned int i=0; i<quad_points.size(); ++i)
3803 a.push_back(quad_points[
fe_q->adjust_quad_dof_index_for_face_orientation(i,
3821 get_intermediate_points_on_object (cell->get_manifold(), line_support_points,
3823 for (
unsigned int i=0; i<quad_points.size(); ++i)
3824 a.push_back(quad_points[i]);
3829 template <
int dim,
int spacedim>
3835 Assert (
false, ExcInternalError());
3840 template<
int dim,
int spacedim>
3841 std::vector<Point<spacedim> >
3847 for (
unsigned int i=0; i<GeometryInfo<dim>::vertices_per_cell; ++i)
3848 a[i] = cell->vertex(i);
3863 if (dim != spacedim)
3881 Assert(
false, ExcNotImplemented());
3891 #include "mapping_q_generic.inst" 3894 DEAL_II_NAMESPACE_CLOSE
Transformed quadrature weights.
std::vector< DerivativeForm< 1, dim, spacedim > > covariant
static const unsigned int invalid_unsigned_int
virtual Point< spacedim > get_new_point(const Quadrature< spacedim > &quad) const
const std_cxx11::unique_ptr< FE_Q< dim > > fe_q
Table< 2, double > support_point_weights_on_hex
#define AssertDimension(dim1, dim2)
std::vector< Tensor< 2, dim > > shape_second_derivatives
const unsigned int polynomial_degree
virtual CellSimilarity::Similarity fill_fe_values(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const CellSimilarity::Similarity cell_similarity, const Quadrature< dim > &quadrature, const typename Mapping< dim, spacedim >::InternalDataBase &internal_data, ::internal::FEValues::MappingRelatedData< dim, spacedim > &output_data) const
Contravariant transformation.
const std::vector< Point< dim > > & get_points() const
virtual void fill_fe_face_values(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const Quadrature< dim-1 > &quadrature, const typename Mapping< dim, spacedim >::InternalDataBase &internal_data, ::internal::FEValues::MappingRelatedData< dim, spacedim > &output_data) const
const std::vector< double > & get_weights() const
virtual InternalData * get_subface_data(const UpdateFlags flags, const Quadrature< dim-1 > &quadrature) const
virtual InternalData * get_data(const UpdateFlags, const Quadrature< dim > &quadrature) const
std::vector< Tensor< 4, dim > > shape_fourth_derivatives
virtual Mapping< dim, spacedim > * clone() const
virtual Point< dim > transform_real_to_unit_cell(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const Point< spacedim > &p) const
::ExceptionBase & ExcMessage(std::string arg1)
Outer normal vector, not normalized.
const Point< dim > & point(const unsigned int i) const
std::vector< Polynomial< double > > generate_complete_Lagrange_basis(const std::vector< Point< 1 > > &points)
void compute(const Point< dim > &unit_point, std::vector< double > &values, std::vector< Tensor< 1, dim > > &grads, std::vector< Tensor< 2, dim > > &grad_grads, std::vector< Tensor< 3, dim > > &third_derivatives, std::vector< Tensor< 4, dim > > &fourth_derivatives) const
void invert(const FullMatrix< number2 > &M)
virtual UpdateFlags requires_update_flags(const UpdateFlags update_flags) const
Determinant of the Jacobian.
Triangulation< dim, spacedim >::cell_iterator cell_of_current_support_points
Transformed quadrature points.
const Tensor< 3, dim > & third_derivative(const unsigned int qpoint, const unsigned int shape_nr) const
MappingQGeneric(const unsigned int polynomial_degree)
#define AssertThrow(cond, exc)
numbers::NumberTraits< Number >::real_type norm() const
static DataSetDescriptor cell()
const Tensor< 4, dim > & fourth_derivative(const unsigned int qpoint, const unsigned int shape_nr) const
InternalData(const unsigned int polynomial_degree)
virtual std_cxx11::array< Point< spacedim >, GeometryInfo< dim >::vertices_per_cell > get_vertices(const typename Triangulation< dim, spacedim >::cell_iterator &cell) const
std::vector< Tensor< 1, dim > > shape_derivatives
virtual void add_quad_support_points(const typename Triangulation< dim, spacedim >::cell_iterator &cell, std::vector< Point< spacedim > > &a) const
void compute_shape_function_values(const std::vector< Point< dim > > &unit_points)
virtual Point< spacedim > get_new_point_on_line(const typename Triangulation< dim, spacedim >::line_iterator &line) const
static unsigned int face_to_cell_lines(const unsigned int face, const unsigned int line, const bool face_orientation=true, const bool face_flip=false, const bool face_rotation=false)
void reinit(const TableIndices< N > &new_size, const bool omit_default_initialization=false)
#define Assert(cond, exc)
Abstract base class for mapping classes.
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
void loop(ITERATOR begin, typename identity< ITERATOR >::type end, DOFINFO &dinfo, INFOBOX &info, const std_cxx11::function< void(DOFINFO &, typename INFOBOX::CellInfo &)> &cell_worker, const std_cxx11::function< void(DOFINFO &, typename INFOBOX::CellInfo &)> &boundary_worker, const std_cxx11::function< void(DOFINFO &, DOFINFO &, typename INFOBOX::CellInfo &, typename INFOBOX::CellInfo &)> &face_worker, ASSEMBLER &assembler, const LoopControl &lctrl=LoopControl())
void mmult(FullMatrix< number2 > &C, const FullMatrix< number2 > &B, const bool adding=false) const
std::vector< Point< spacedim > > mapping_support_points
std::vector< DerivativeForm< 1, dim, spacedim > > contravariant
std::vector< std::vector< Tensor< 1, spacedim > > > aux
void initialize(const UpdateFlags update_flags, const Quadrature< dim > &quadrature, const unsigned int n_original_q_points)
std::vector< double > volume_elements
Gradient of volume element.
const unsigned int n_shape_functions
unsigned int size() const
Point< dim > transform_real_to_unit_cell_internal(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const Point< spacedim > &p, const Point< dim > &initial_p_unit) const
virtual std::size_t memory_consumption() const
unsigned int get_degree() const
std_cxx11::enable_if< std_cxx11::is_fundamental< T >::value, std::size_t >::type memory_consumption(const T &t)
const double & shape(const unsigned int qpoint, const unsigned int shape_nr) const
const types::manifold_id invalid_manifold_id
Number determinant(const Tensor< 2, dim, Number > &t)
virtual Point< spacedim > transform_unit_to_real_cell(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const Point< dim > &p) const
unsigned int polynomial_degree
Table< 2, double > support_point_weights_on_quad
void do_fill_fe_face_values(const ::MappingFEField< dim, spacedim > &mapping, const typename ::Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const unsigned int subface_no, const typename ::QProjector< dim >::DataSetDescriptor data_set, const Quadrature< dim-1 > &quadrature, const typename ::MappingFEField< dim, spacedim >::InternalData &data, const FiniteElement< dim, spacedim > &fe, const ComponentMask &fe_mask, const std::vector< unsigned int > &fe_to_real, internal::FEValues::MappingRelatedData< dim, spacedim > &output_data)
virtual void fill_fe_subface_values(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const unsigned int subface_no, const Quadrature< dim-1 > &quadrature, const typename Mapping< dim, spacedim >::InternalDataBase &internal_data, ::internal::FEValues::MappingRelatedData< dim, spacedim > &output_data) const
virtual std::vector< Point< spacedim > > compute_mapping_support_points(const typename Triangulation< dim, spacedim >::cell_iterator &cell) const
virtual void add_line_support_points(const typename Triangulation< dim, spacedim >::cell_iterator &cell, std::vector< Point< spacedim > > &a) const
virtual InternalData * get_face_data(const UpdateFlags flags, const Quadrature< dim-1 > &quadrature) const
static Point< dim > project_to_unit_cell(const Point< dim > &p)
std::vector< Tensor< 3, dim > > shape_third_derivatives
const Tensor< 2, dim > & second_derivative(const unsigned int qpoint, const unsigned int shape_nr) const
const Tensor< 1, dim > & derivative(const unsigned int qpoint, const unsigned int shape_nr) const
void initialize_face(const UpdateFlags update_flags, const Quadrature< dim > &quadrature, const unsigned int n_original_q_points)
std::vector< std::vector< Tensor< 1, dim > > > unit_tangentials
double compute_value(const unsigned int i, const Point< dim > &p) const
std::vector< double > shape_values
static double subface_ratio(const internal::SubfaceCase< dim > &subface_case, const unsigned int subface_no)
const Manifold< dim, spacedim > & get_manifold(const types::manifold_id number) const
Covariant transformation.
double weight(const unsigned int i) const