44 const std::vector<Point> *
const,
45 const std::vector<Real> *
const)
47 libmesh_error_msg(
"ERROR: This method only makes sense for 2D/3D elements!");
57 const std::vector<Point> *
const,
58 const std::vector<Real> *
const)
60 libmesh_error_msg(
"ERROR: This method only makes sense for 2D/3D elements!");
66 template <
unsigned int Dim>
70 const std::vector<Point> *
const pts,
71 const std::vector<Real> *
const weights)
74 libmesh_assert (this->qrule !=
nullptr || pts !=
nullptr);
76 libmesh_assert_not_equal_to (Dim, 1);
87 this->shapes_on_quadrature =
false;
90 this->elem_type = elem->
type();
93 this->_fe_map->template init_face_shape_functions<Dim>(*pts,
side.get());
94 if (weights !=
nullptr)
96 this->compute_face_values (elem,
side.get(), *weights);
100 std::vector<Real> dummy_weights (pts->size(), 1.);
102 this->compute_face_values (elem,
side.get(), dummy_weights);
112 this->elem_type = elem->
type();
115 this->_fe_map->template init_face_shape_functions<Dim>(this->qrule->get_points(),
side.get());
119 this->shapes_on_quadrature =
false;
121 this->compute_face_values (elem,
side.get(), this->qrule->get_weights());
127 template <
unsigned int Dim>
130 const std::vector<Real> & qw)
132 libmesh_assert(elem);
133 libmesh_assert(
side);
135 LOG_SCOPE(
"compute_face_values()",
"FEXYZ");
138 const std::size_t n_qp = qw.size();
142 const unsigned int n_approx_shape_functions =
143 this->n_shape_functions(this->get_type(),
147 this->phi.resize (n_approx_shape_functions);
148 this->dphi.resize (n_approx_shape_functions);
149 this->dphidx.resize (n_approx_shape_functions);
150 this->dphidy.resize (n_approx_shape_functions);
151 this->dphidz.resize (n_approx_shape_functions);
153 for (
unsigned int i=0; i<n_approx_shape_functions; i++)
155 this->phi[i].resize (n_qp);
156 this->dphi[i].resize (n_qp);
157 this->dphidx[i].resize (n_qp);
158 this->dphidy[i].resize (n_qp);
159 this->dphidz[i].resize (n_qp);
162 this->_fe_map->compute_face_map(this->dim, qw,
side);
164 const std::vector<libMesh::Point> & xyz = this->_fe_map->get_xyz();
174 for (
unsigned int i=0; i<n_approx_shape_functions; i++)
175 for (std::size_t p=0; p<n_qp; p++)
179 this->dphi[i][p](0) =
182 this->dphi[i][p](1) =
186 this->dphi[i][p](2) =
188 this->dphidz[i][p] = 0.;
199 for (
unsigned int i=0; i<n_approx_shape_functions; i++)
200 for (std::size_t p=0; p<n_qp; p++)
204 this->dphi[i][p](0) =
207 this->dphi[i][p](1) =
210 this->dphi[i][p](2) =
219 libmesh_error_msg(
"Invalid dim " << this->dim);
static OutputShape shape(const ElemType t, const Order o, const unsigned int i, const Point &p)
void compute_face_values(const Elem *elem, const Elem *side, const std::vector< Real > &weights)
The base class for all geometric element types.
unsigned int p_level() const
virtual std::unique_ptr< Elem > build_side_ptr(const unsigned int i, bool proxy=true)=0
Template class which generates the different FE families and orders.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual ElemType type() const =0
virtual void reinit(const Elem *elem, const std::vector< Point > *const pts=nullptr, const std::vector< Real > *const weights=nullptr) override