26 #include "libmesh/libmesh_common.h" 27 #include "libmesh/fe.h" 28 #include "libmesh/quadrature.h" 29 #include "libmesh/elem.h" 30 #include "libmesh/libmesh_logging.h" 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)
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);
108 this->qrule->init(side->type(), elem->
p_level());
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)
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)
Compute the map & shape functions for this face.
This is the base class from which all geometric element types are derived.
unsigned int p_level() const
The libMesh namespace provides an interface to certain functionality in the library.
virtual std::unique_ptr< Elem > build_side_ptr(const unsigned int i, bool proxy=false)=0
A specific instantiation of the FEBase class.
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
Explicitly call base class method.