23 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 36 template <
unsigned int Dim, FEFamily T_radial, InfMapType T_map>
40 _n_total_approx_sf (0),
50 current_fe_type (
FEType(fet.order,
68 template <
unsigned int Dim, FEFamily T_radial, InfMapType T_map>
72 libmesh_assert(base_fe);
75 const Order radial_int_order =
static_cast<Order>(2 * (
static_cast<unsigned int>(fe_type.radial_order.get_order()) + 1) +2);
76 const unsigned int qrule_dim = q->
get_dim();
82 base_fe->attach_quadrature_rule(base_qrule.get());
86 radial_qrule.reset(
new QGauss(1, radial_int_order));
97 template <
unsigned int Dim, FEFamily T_radial, InfMapType T_base>
100 base_elem.reset(Base::build_elem(inf_elem));
108 template <
unsigned int Dim, FEFamily T_radial, InfMapType T_map>
110 const std::vector<Point> *
const pts,
111 const std::vector<Real> *
const weights)
113 libmesh_assert(base_fe.get());
114 libmesh_assert(inf_elem);
118 this->calculate_phi = this->calculate_dphi = this->calculate_dphiref =
true;
120 this->determine_calculations();
121 base_fe->calculate_phi = base_fe->calculate_dphi = base_fe->calculate_dphiref =
true;
123 base_fe->determine_calculations();
127 libmesh_assert(base_fe->qrule);
128 libmesh_assert_equal_to (base_fe->qrule, base_qrule.get());
129 libmesh_assert(radial_qrule.get());
131 bool init_shape_functions_required =
false;
134 if (current_fe_type.radial_order != fe_type.radial_order)
136 current_fe_type.radial_order = fe_type.radial_order;
141 radial_qrule->init(
EDGE2);
144 this->init_radial_shape_functions(inf_elem);
146 init_shape_functions_required=
true;
150 bool update_base_elem_required=
true;
157 ((this->get_type() != inf_elem->
type()) ||
158 (base_fe->shapes_need_reinit())))
163 elem_type = inf_elem->
type();
164 this->update_base_elem(inf_elem);
165 update_base_elem_required=
false;
168 base_qrule->init(base_elem->type());
171 base_fe->init_base_shape_functions(base_fe->qrule->get_points(),
176 base_fe->_fe_map->compute_map (base_fe->dim, base_fe->qrule->get_weights(),
177 base_elem.get(), base_fe->calculate_d2phi);
178 base_fe->compute_shape_functions(base_elem.get(), base_fe->qrule->get_points());
180 init_shape_functions_required=
true;
186 if (init_shape_functions_required)
187 this->init_shape_functions (radial_qrule->get_points(),
188 base_fe->qrule->get_points(),
195 if (update_base_elem_required)
196 this->update_base_elem(inf_elem);
200 this->combine_base_radial (inf_elem);
202 this->_fe_map->compute_map (this->dim, _total_qrule_weights, inf_elem, this->calculate_d2phi);
206 this->compute_shape_functions (inf_elem,base_fe->qrule->get_points());
212 elem_type = inf_elem->
type();
218 std::vector<Point> radial_pts;
221 Real radius = (*pts)[p](Dim-1);
225 if (radial_pts.size() && radial_pts[0](0) == radius)
227 radial_pts.push_back(
Point(radius));
229 const std::size_t radial_pts_size = radial_pts.size();
230 const std::size_t base_pts_size = pts->size() / radial_pts_size;
232 libmesh_assert_equal_to
233 (base_pts_size * radial_pts_size, pts->size());
240 libmesh_experimental();
241 libmesh_warning(
"We assume that the "<<pts->size()
242 <<
" points are of tensor-product type with " 243 <<radial_pts_size<<
" radial points and " 244 <<base_pts_size<<
" angular points.");
248 std::vector<Point> base_pts;
249 base_pts.reserve(base_pts_size);
250 for (std::size_t p=0; p != pts->size(); p += radial_pts_size)
252 Point pt = (*pts)[p];
254 base_pts.push_back(pt);
258 this->init_radial_shape_functions(inf_elem, &radial_pts);
261 this->update_base_elem(inf_elem);
266 base_fe->calculate_phi = base_fe->calculate_dphi = base_fe->calculate_dphiref =
true;
268 base_fe->determine_calculations();
271 base_fe->init_base_shape_functions(base_pts,
279 base_fe->_fe_map->compute_map (base_fe->dim, *weights,
280 base_elem.get(), base_fe->calculate_d2phi);
284 std::vector<Real> dummy_weights (pts->size(), 1.);
285 base_fe->_fe_map->compute_map (base_fe->dim, dummy_weights,
286 base_elem.get(), base_fe->calculate_d2phi);
289 base_fe->compute_shape_functions(base_elem.get(), *pts);
291 this->init_shape_functions (radial_pts, base_pts, inf_elem);
294 this->combine_base_radial (inf_elem);
297 if (weights !=
nullptr)
299 this->_fe_map->compute_map (this->dim, *weights, inf_elem, this->calculate_d2phi);
303 std::vector<Real> dummy_weights (pts->size(), 1.);
304 this->_fe_map->compute_map (this->dim, dummy_weights, inf_elem, this->calculate_d2phi);
308 this->compute_shape_functions (inf_elem,*pts);
317 template <
unsigned int Dim, FEFamily T_radial, InfMapType T_map>
321 const std::vector<Point> * radial_pts)
323 libmesh_assert(radial_qrule.get() || radial_pts);
324 libmesh_assert(inf_elem);
327 LOG_SCOPE(
"init_radial_shape_functions()",
"InfFE");
332 const Order radial_mapping_order = Radial::mapping_order();
333 const unsigned int n_radial_mapping_shape_functions = Radial::n_dofs(radial_mapping_order);
336 const Order radial_approx_order = fe_type.radial_order;
337 const unsigned int n_radial_approx_shape_functions = Radial::n_dofs(radial_approx_order);
339 const std::size_t n_radial_qp =
340 radial_pts ? radial_pts->size() : radial_qrule->n_points();
341 const std::vector<Point> & radial_qp =
342 radial_pts ? *radial_pts : radial_qrule->get_points();
347 mode.resize (n_radial_approx_shape_functions);
348 dmodedv.resize (n_radial_approx_shape_functions);
351 som.resize (n_radial_qp);
352 dsomdv.resize (n_radial_qp);
355 radial_map.resize (n_radial_mapping_shape_functions);
356 dradialdv_map.resize (n_radial_mapping_shape_functions);
359 for (
unsigned int i=0; i<n_radial_mapping_shape_functions; i++)
361 radial_map[i].resize (n_radial_qp);
362 dradialdv_map[i].resize (n_radial_qp);
366 for (
unsigned int i=0; i<n_radial_approx_shape_functions; i++)
368 mode[i].resize (n_radial_qp);
369 dmodedv[i].resize (n_radial_qp);
374 for (std::size_t p=0; p<n_radial_qp; p++)
376 som[p] = Radial::decay (radial_qp[p](0));
377 dsomdv[p] = Radial::decay_deriv (radial_qp[p](0));
382 for (
unsigned int i=0; i<n_radial_approx_shape_functions; i++)
383 for (std::size_t p=0; p<n_radial_qp; p++)
391 for (
unsigned int i=0; i<n_radial_mapping_shape_functions; i++)
392 for (std::size_t p=0; p<n_radial_qp; p++)
403 template <
unsigned int Dim, FEFamily T_radial, InfMapType T_map>
405 const std::vector<Point> & base_qp,
406 const Elem * inf_elem)
408 libmesh_assert(inf_elem);
411 LOG_SCOPE(
"init_shape_functions()",
"InfFE");
414 const unsigned int n_radial_mapping_sf = cast_int<unsigned int>(radial_map.size());
415 const unsigned int n_radial_approx_sf = cast_int<unsigned int>(mode.size());
416 const unsigned int n_radial_qp = cast_int<unsigned int>(som.size());
422 const Order base_mapping_order = base_elem->default_order();
423 const ElemType base_mapping_elem_type = base_elem->type();
427 unsigned int n_base_mapping_shape_functions = Base::n_base_mapping_sf(base_mapping_elem_type,
430 const unsigned int n_total_mapping_shape_functions =
431 n_radial_mapping_sf * n_base_mapping_shape_functions;
434 unsigned int n_base_approx_shape_functions;
436 n_base_approx_shape_functions = base_fe->n_shape_functions();
438 n_base_approx_shape_functions = 1;
441 const unsigned int n_total_approx_shape_functions =
442 n_radial_approx_sf * n_base_approx_shape_functions;
445 _n_total_approx_sf = n_total_approx_shape_functions;
449 const unsigned int n_base_qp = cast_int<unsigned int>(base_qp.size());
452 const unsigned int n_total_qp = n_radial_qp * n_base_qp;
456 _n_total_qp = n_total_qp;
464 _radial_node_index.resize(n_total_mapping_shape_functions);
465 _base_node_index.resize(n_total_mapping_shape_functions);
469 _radial_shape_index.resize(n_total_approx_shape_functions);
470 _base_shape_index.resize(n_total_approx_shape_functions);
475 for (
unsigned int n=0; n<n_total_mapping_shape_functions; n++)
477 compute_node_indices (inf_elem_type,
480 _radial_node_index[n]);
481 libmesh_assert_less (_base_node_index[n], n_base_mapping_shape_functions);
482 libmesh_assert_less (_radial_node_index[n], n_radial_mapping_sf);
486 for (
unsigned int n=0; n<n_total_approx_shape_functions; n++)
488 compute_shape_indices (this->fe_type,
491 _base_shape_index[n],
492 _radial_shape_index[n]);
493 libmesh_assert_less (_base_shape_index[n], n_base_approx_shape_functions);
494 libmesh_assert_less (_radial_shape_index[n], n_radial_approx_sf);
499 dist.resize(n_base_mapping_shape_functions);
512 weight.resize (n_total_qp);
513 dweightdv.resize (n_total_qp);
514 dweight.resize (n_total_qp);
516 dphase.resize (n_total_qp);
517 dphasedxi.resize (n_total_qp);
518 dphasedeta.resize (n_total_qp);
519 dphasedzeta.resize (n_total_qp);
522 _total_qrule_weights.resize(n_total_qp);
527 phi.resize (n_total_approx_shape_functions);
528 dphi.resize (n_total_approx_shape_functions);
529 dphidx.resize (n_total_approx_shape_functions);
530 dphidy.resize (n_total_approx_shape_functions);
531 dphidz.resize (n_total_approx_shape_functions);
532 dphidxi.resize (n_total_approx_shape_functions);
533 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 534 libmesh_warning(
"Warning: Second derivatives for Infinite elements" 535 <<
" are not yet implemented!" 538 d2phi.resize (n_total_approx_shape_functions);
539 d2phidx2.resize (n_total_approx_shape_functions);
540 d2phidxdy.resize (n_total_approx_shape_functions);
541 d2phidxdz.resize (n_total_approx_shape_functions);
542 d2phidy2.resize (n_total_approx_shape_functions);
543 d2phidydz.resize (n_total_approx_shape_functions);
544 d2phidz2.resize (n_total_approx_shape_functions);
545 d2phidxi2.resize (n_total_approx_shape_functions);
549 d2phidxideta.resize(n_total_approx_shape_functions);
550 d2phideta2.resize(n_total_approx_shape_functions);
555 d2phidetadzeta.resize(n_total_approx_shape_functions);
556 d2phidxidzeta.resize(n_total_approx_shape_functions);
557 d2phidzeta2.resize(n_total_approx_shape_functions);
559 #endif // ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 562 dphideta.resize(n_total_approx_shape_functions);
565 dphidzeta.resize(n_total_approx_shape_functions);
567 std::vector<std::vector<Real>> & phi_map = this->_fe_map->get_phi_map();
568 std::vector<std::vector<Real>> & dphidxi_map = this->_fe_map->get_dphidxi_map();
570 phi_map.resize(n_total_mapping_shape_functions);
571 dphidxi_map.resize(n_total_mapping_shape_functions);
572 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 573 std::vector<std::vector<Real>> & d2phidxi2_map = this->_fe_map->get_d2phidxi2_map();
574 d2phidxi2_map.resize(n_total_mapping_shape_functions);
578 std::vector<std::vector<Real>> & d2phidxideta_map = this->_fe_map->get_d2phidxideta_map();
579 std::vector<std::vector<Real>> & d2phideta2_map = this->_fe_map->get_d2phideta2_map();
580 d2phidxideta_map.resize(n_total_mapping_shape_functions);
581 d2phideta2_map.resize(n_total_mapping_shape_functions);
586 std::vector<std::vector<Real>> & d2phidxidzeta_map = this->_fe_map->get_d2phidxidzeta_map();
587 std::vector<std::vector<Real>> & d2phidetadzeta_map = this->_fe_map->get_d2phidetadzeta_map();
588 std::vector<std::vector<Real>> & d2phidzeta2_map = this->_fe_map->get_d2phidzeta2_map();
589 d2phidxidzeta_map.resize(n_total_mapping_shape_functions);
590 d2phidetadzeta_map.resize(n_total_mapping_shape_functions);
591 d2phidzeta2_map.resize(n_total_mapping_shape_functions);
593 #endif // ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 597 std::vector<std::vector<Real>> & dphideta_map = this->_fe_map->get_dphideta_map();
598 dphideta_map.resize(n_total_mapping_shape_functions);
603 std::vector<std::vector<Real>> & dphidzeta_map = this->_fe_map->get_dphidzeta_map();
604 dphidzeta_map.resize(n_total_mapping_shape_functions);
611 for (
unsigned int i=0; i<n_total_approx_shape_functions; i++)
613 phi[i].resize (n_total_qp);
614 dphi[i].resize (n_total_qp);
615 dphidx[i].resize (n_total_qp);
616 dphidy[i].resize (n_total_qp);
617 dphidz[i].resize (n_total_qp);
618 dphidxi[i].resize (n_total_qp);
619 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 620 d2phi[i].resize (n_total_qp);
621 d2phidx2[i].resize (n_total_qp);
622 d2phidxdy[i].resize (n_total_qp);
623 d2phidxdz[i].resize (n_total_qp);
624 d2phidy2[i].resize (n_total_qp);
625 d2phidydz[i].resize (n_total_qp);
626 d2phidy2[i].resize (n_total_qp);
627 d2phidxi2[i].resize (n_total_qp);
631 d2phidxideta[i].resize (n_total_qp);
632 d2phideta2[i].resize (n_total_qp);
636 d2phidxidzeta[i].resize (n_total_qp);
637 d2phidetadzeta[i].resize (n_total_qp);
638 d2phidzeta2[i].resize (n_total_qp);
640 #endif // ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 643 dphideta[i].resize (n_total_qp);
646 dphidzeta[i].resize (n_total_qp);
650 for (
unsigned int i=0; i<n_total_mapping_shape_functions; i++)
652 std::vector<std::vector<Real>> & phi_map = this->_fe_map->get_phi_map();
653 std::vector<std::vector<Real>> & dphidxi_map = this->_fe_map->get_dphidxi_map();
654 phi_map[i].resize (n_total_qp);
655 dphidxi_map[i].resize (n_total_qp);
656 #ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 657 std::vector<std::vector<Real>> & d2phidxi2_map = this->_fe_map->get_d2phidxi2_map();
658 d2phidxi2_map[i].resize (n_total_qp);
661 std::vector<std::vector<Real>> & d2phidxideta_map = this->_fe_map->get_d2phidxideta_map();
662 std::vector<std::vector<Real>> & d2phideta2_map = this->_fe_map->get_d2phideta2_map();
663 d2phidxideta_map[i].resize (n_total_qp);
664 d2phideta2_map[i].resize (n_total_qp);
669 std::vector<std::vector<Real>> & d2phidxidzeta_map = this->_fe_map->get_d2phidxidzeta_map();
670 std::vector<std::vector<Real>> & d2phidetadzeta_map = this->_fe_map->get_d2phidetadzeta_map();
671 std::vector<std::vector<Real>> & d2phidzeta2_map = this->_fe_map->get_d2phidzeta2_map();
672 d2phidxidzeta_map[i].resize (n_total_qp);
673 d2phidetadzeta_map[i].resize (n_total_qp);
674 d2phidzeta2_map[i].resize (n_total_qp);
676 #endif // ifdef LIBMESH_ENABLE_SECOND_DERIVATIVES 680 std::vector<std::vector<Real>> & dphideta_map = this->_fe_map->get_dphideta_map();
681 dphideta_map[i].resize (n_total_qp);
686 std::vector<std::vector<Real>> & dphidzeta_map = this->_fe_map->get_dphidzeta_map();
687 dphidzeta_map[i].resize (n_total_qp);
699 libmesh_assert_equal_to (radial_qp.size(), n_radial_qp);
701 if (radial_qrule && base_qrule)
703 const std::vector<Real> & radial_qw = radial_qrule->get_weights();
704 const std::vector<Real> & base_qw = base_qrule->get_weights();
705 libmesh_assert_equal_to (radial_qw.size(), n_radial_qp);
706 libmesh_assert_equal_to (base_qw.size(), n_base_qp);
708 for (
unsigned int rp=0; rp<n_radial_qp; rp++)
709 for (
unsigned int bp=0; bp<n_base_qp; bp++)
711 weight[bp + rp*n_base_qp] = Radial::D(radial_qp[rp](0));
712 dweightdv[bp + rp*n_base_qp] = Radial::D_deriv(radial_qp[rp](0));
713 _total_qrule_weights[bp + rp*n_base_qp] = radial_qw[rp] * base_qw[bp];
718 for (
unsigned int rp=0; rp<n_radial_qp; rp++)
719 for (
unsigned int bp=0; bp<n_base_qp; bp++)
721 weight[bp + rp*n_base_qp] = Radial::D(radial_qp[rp](0));
722 dweightdv[bp + rp*n_base_qp] = Radial::D_deriv(radial_qp[rp](0));
732 template <
unsigned int Dim, FEFamily T_radial, InfMapType T_map>
735 libmesh_assert(inf_elem);
738 libmesh_assert_equal_to (base_elem->type(), Base::get_elem_type(inf_elem->
type()));
741 LOG_SCOPE(
"combine_base_radial()",
"InfFE");
744 std::fill (dphasedxi.begin(), dphasedxi.end(), 0.);
745 std::fill (dphasedeta.begin(), dphasedeta.end(), 0.);
746 std::fill (dphasedzeta.begin(), dphasedzeta.end(), 0.);
749 const unsigned int n_base_mapping_sf = cast_int<unsigned int>(dist.size());
753 for (
unsigned int n=0; n<n_base_mapping_sf; n++)
754 dist[n] =
Point(base_elem->point(n) - origin).norm();
762 libmesh_not_implemented();
769 libmesh_not_implemented();
777 const std::vector<std::vector<Real>> & S = base_fe->phi;
778 const std::vector<std::vector<Real>> & Ss = base_fe->dphidxi;
779 const std::vector<std::vector<Real>> & St = base_fe->dphideta;
780 const std::vector<std::vector<Real>> & S_map = (base_fe->get_fe_map()).get_phi_map();
781 const std::vector<std::vector<Real>> & Ss_map = (base_fe->get_fe_map()).get_dphidxi_map();
782 const std::vector<std::vector<Real>> & St_map = (base_fe->get_fe_map()).get_dphideta_map();
784 const unsigned int n_radial_qp = cast_int<unsigned int>(som.size());
786 libmesh_assert_equal_to(n_radial_qp, radial_qrule->n_points());
787 const unsigned int n_base_qp = cast_int<unsigned int>(S_map[0].size());
789 libmesh_assert_equal_to(n_base_qp, base_qrule->n_points());
791 const unsigned int n_total_mapping_sf =
792 cast_int<unsigned int>(radial_map.size()) * n_base_mapping_sf;
794 const unsigned int n_total_approx_sf = Radial::n_dofs(fe_type.radial_order) * base_fe->n_shape_functions();
800 for (
unsigned int rp=0; rp<n_radial_qp; rp++)
801 for (
unsigned int bp=0; bp<n_base_qp; bp++)
804 for (
unsigned int i=0; i<n_base_mapping_sf; i++)
806 dphasedxi[tp] += Ss_map[i][bp] * dist[i] * radial_map [1][rp];
807 dphasedeta[tp] += St_map[i][bp] * dist[i] * radial_map [1][rp];
808 dphasedzeta[tp] += S_map [i][bp] * dist[i] * dradialdv_map[1][rp];
816 libmesh_assert_equal_to (phi.size(), n_total_approx_sf);
817 libmesh_assert_equal_to (dphidxi.size(), n_total_approx_sf);
818 libmesh_assert_equal_to (dphideta.size(), n_total_approx_sf);
819 libmesh_assert_equal_to (dphidzeta.size(), n_total_approx_sf);
824 for (
unsigned int rp=0; rp<n_radial_qp; rp++)
825 for (
unsigned int bp=0; bp<n_base_qp; bp++)
826 for (
unsigned int ti=0; ti<n_total_approx_sf; ti++)
829 const unsigned int bi = _base_shape_index [ti];
830 const unsigned int ri = _radial_shape_index[ti];
831 phi [ti][bp+rp*n_base_qp] = S [bi][bp] * mode[ri][rp] * som[rp];
832 dphidxi [ti][bp+rp*n_base_qp] = Ss[bi][bp] * mode[ri][rp] * som[rp];
833 dphideta [ti][bp+rp*n_base_qp] = St[bi][bp] * mode[ri][rp] * som[rp];
834 dphidzeta[ti][bp+rp*n_base_qp] = S [bi][bp]
835 * (dmodedv[ri][rp] * som[rp] + mode[ri][rp] * dsomdv[rp]);
838 std::vector<std::vector<Real>> & phi_map = this->_fe_map->get_phi_map();
839 std::vector<std::vector<Real>> & dphidxi_map = this->_fe_map->get_dphidxi_map();
840 std::vector<std::vector<Real>> & dphideta_map = this->_fe_map->get_dphideta_map();
841 std::vector<std::vector<Real>> & dphidzeta_map = this->_fe_map->get_dphidzeta_map();
843 libmesh_assert_equal_to (phi_map.size(), n_total_mapping_sf);
844 libmesh_assert_equal_to (dphidxi_map.size(), n_total_mapping_sf);
845 libmesh_assert_equal_to (dphideta_map.size(), n_total_mapping_sf);
846 libmesh_assert_equal_to (dphidzeta_map.size(), n_total_mapping_sf);
851 for (
unsigned int rp=0; rp<n_radial_qp; rp++)
852 for (
unsigned int bp=0; bp<n_base_qp; bp++)
853 for (
unsigned int ti=0; ti<n_total_mapping_sf; ti++)
856 const unsigned int bi = _base_node_index [ti];
857 const unsigned int ri = _radial_node_index[ti];
858 phi_map [ti][bp+rp*n_base_qp] = S_map [bi][bp] * radial_map [ri][rp];
859 dphidxi_map [ti][bp+rp*n_base_qp] = Ss_map[bi][bp] * radial_map [ri][rp];
860 dphideta_map [ti][bp+rp*n_base_qp] = St_map[bi][bp] * radial_map [ri][rp];
861 dphidzeta_map[ti][bp+rp*n_base_qp] = S_map [bi][bp] * dradialdv_map[ri][rp];
868 libmesh_error_msg(
"Unsupported Dim = " << Dim);
877 template <
unsigned int Dim, FEFamily T_radial, InfMapType T_map>
879 const std::vector<Point> &)
882 LOG_SCOPE(
"compute_shape_functions()",
"InfFE");
884 const unsigned int n_total_qp = _n_total_qp;
896 libmesh_not_implemented();
902 libmesh_not_implemented();
908 const std::vector<Real> & dxidx_map = this->_fe_map->get_dxidx();
909 const std::vector<Real> & dxidy_map = this->_fe_map->get_dxidy();
910 const std::vector<Real> & dxidz_map = this->_fe_map->get_dxidz();
912 const std::vector<Real> & detadx_map = this->_fe_map->get_detadx();
913 const std::vector<Real> & detady_map = this->_fe_map->get_detady();
914 const std::vector<Real> & detadz_map = this->_fe_map->get_detadz();
916 const std::vector<Real> & dzetadx_map = this->_fe_map->get_dzetadx();
917 const std::vector<Real> & dzetady_map = this->_fe_map->get_dzetady();
918 const std::vector<Real> & dzetadz_map = this->_fe_map->get_dzetadz();
922 for (
unsigned int p=0; p<n_total_qp; p++)
926 dphidx[i][p] = (dphidxi[i][p]*dxidx_map[p] +
927 dphideta[i][p]*detadx_map[p] +
928 dphidzeta[i][p]*dzetadx_map[p]);
932 dphidy[i][p] = (dphidxi[i][p]*dxidy_map[p] +
933 dphideta[i][p]*detady_map[p] +
934 dphidzeta[i][p]*dzetady_map[p]);
938 dphidz[i][p] = (dphidxi[i][p]*dxidz_map[p] +
939 dphideta[i][p]*detadz_map[p] +
940 dphidzeta[i][p]*dzetadz_map[p]);
945 for (
unsigned int p=0; p<n_total_qp; p++)
948 dphase[p](0) = (dphasedxi[p] * dxidx_map[p] +
949 dphasedeta[p] * detadx_map[p] +
950 dphasedzeta[p] * dzetadx_map[p]);
952 dphase[p](1) = (dphasedxi[p] * dxidy_map[p] +
953 dphasedeta[p] * detady_map[p] +
954 dphasedzeta[p] * dzetady_map[p]);
956 dphase[p](2) = (dphasedxi[p] * dxidz_map[p] +
957 dphasedeta[p] * detadz_map[p] +
958 dphasedzeta[p] * dzetadz_map[p]);
962 dweight[p](0) = dweightdv[p] * dzetadx_map[p];
964 dweight[p](1) = dweightdv[p] * dzetady_map[p];
966 dweight[p](2) = dweightdv[p] * dzetadz_map[p];
973 libmesh_error_msg(
"Unsupported dim = " << dim);
979 template <
unsigned int Dim, FEFamily T_radial, InfMapType T_map>
995 #endif //ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS Manages the family, order, etc. parameters for a given FE.
virtual Point origin() const
void combine_base_radial(const Elem *inf_elem)
static Real eval_deriv(Real v, Order o_radial, unsigned int i)
void init_shape_functions(const std::vector< Point > &radial_qp, const std::vector< Point > &base_qp, const Elem *inf_elem)
The base class for all geometric element types.
IntRange< std::size_t > index_range(const std::vector< T > &vec)
virtual QuadratureType type() const =0
virtual void compute_shape_functions(const Elem *, const std::vector< Point > &) override
std::unique_ptr< FEBase > base_fe
static std::unique_ptr< FEGenericBase > build(const unsigned int dim, const FEType &type)
static Real eval(Real v, Order o_radial, unsigned int i)
unsigned int get_dim() const
virtual bool shapes_need_reinit() const override
void init_radial_shape_functions(const Elem *inf_elem, const std::vector< Point > *radial_pts=nullptr)
static std::unique_ptr< QBase > build(const std::string &name, const unsigned int dim, const Order order=INVALID_ORDER)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Implements 1, 2, and 3D "Gaussian" quadrature rules.
virtual void reinit(const Elem *elem, const std::vector< Point > *const pts=nullptr, const std::vector< Real > *const weights=nullptr) override
virtual void attach_quadrature_rule(QBase *q) override
virtual ElemType type() const =0
A geometric point in (x,y,z) space.
Base class for all quadrature families and orders.
void update_base_elem(const Elem *inf_elem)