20 #ifndef __mast_fe_shape_derivative_h__ 21 #define __mast_fe_shape_derivative_h__ 31 namespace Evaluation {
33 template <
typename BasisScalarType,
34 typename NodalScalarType,
49 using dxi_dx_mat_t =
typename Eigen::Map<const typename Eigen::Matrix<NodalScalarType, ElemDim, SpatialDim>>;
50 using dx_dxi_mat_t =
typename Eigen::Map<const typename Eigen::Matrix<NodalScalarType, SpatialDim, ElemDim>>;
51 using dphi_dx_mat_t =
typename Eigen::Map<const typename Eigen::Matrix<NodalScalarType, Eigen::Dynamic, SpatialDim>>;
52 using dphi_dx_vec_t =
typename Eigen::Map<const typename Eigen::Matrix<NodalScalarType, Eigen::Dynamic, 1>>;
53 using normal_vec_t =
typename Eigen::Map<const typename Eigen::Matrix<NodalScalarType, SpatialDim, 1>>;
55 "The nodal scalar type should be the derived scalar type.");
57 "BasisScalarType incompatible with FEBasisType::scalar_t.");
58 static_assert(ElemDim == FEBasisType::dim,
59 "FE Dimension should be same as element dimension.");
119 template <
typename ContextType>
120 inline void reinit(
const ContextType& c) {
124 Assert2(c.elem_dim() == ElemDim,
125 c.elem_dim(), ElemDim,
126 "Incorrect dimension of element.");
130 <NodalScalarType, ElemDim, SpatialDim, FEBasisType, ContextType>
135 <NodalScalarType, ElemDim, SpatialDim, FEBasisType, ContextType>
139 MAST::FEBasis::Evaluation::compute_detJ<NodalScalarType, ElemDim, SpatialDim>
144 <NodalScalarType, ElemDim, SpatialDim, FEBasisType, ContextType>
148 MAST::FEBasis::Evaluation::compute_Jac_inv<NodalScalarType, ElemDim, SpatialDim>
153 <NodalScalarType, ElemDim, SpatialDim, FEBasisType>
158 template <
typename ContextType>
163 Assert2(c.elem_dim() == ElemDim,
164 c.elem_dim(), ElemDim,
165 "Incorrect dimension of element.");
169 <NodalScalarType, ElemDim, SpatialDim, FEBasisType, ContextType>
174 <NodalScalarType, ElemDim, SpatialDim, FEBasisType, ContextType>
179 <NodalScalarType, ElemDim, SpatialDim, ContextType>
184 <NodalScalarType, ElemDim, SpatialDim, FEBasisType, ContextType>
188 MAST::FEBasis::Evaluation::compute_Jac_inv<NodalScalarType, ElemDim, SpatialDim>
193 <NodalScalarType, ElemDim, SpatialDim, FEBasisType>
198 <NodalScalarType, ElemDim, SpatialDim, ContextType>
231 return _fe_basis->dphi_dxi(qp, phi_i, xi_i);
245 return _xyz(x_i, qp);
269 return _dx_dxi(xi_i*spatial_dim+x_i, qp);
281 return _dxi_dx(x_i*ref_dim+xi_i, qp);
320 "Invalid normal component index");
338 "Invalid normal component index");
355 Eigen::Matrix<NodalScalarType, SpatialDim, Eigen::Dynamic>
_node_coord;
356 Eigen::Matrix<NodalScalarType, SpatialDim, Eigen::Dynamic>
_xyz;
357 Eigen::Matrix<NodalScalarType, Eigen::Dynamic, 1>
_detJ;
358 Eigen::Matrix<NodalScalarType, Eigen::Dynamic, 1>
_detJxW;
359 Eigen::Matrix<NodalScalarType, SpatialDim*ElemDim, Eigen::Dynamic>
_dx_dxi;
360 Eigen::Matrix<NodalScalarType, ElemDim*SpatialDim, Eigen::Dynamic>
_dxi_dx;
361 Eigen::Matrix<NodalScalarType, Eigen::Dynamic, Eigen::Dynamic>
_dphi_dx;
363 Eigen::Matrix<NodalScalarType, SpatialDim, Eigen::Dynamic>
_side_normal;
371 #endif // __mast_fe_shape_derivative_h__ normal_vec_t tangent(uint_t qp) const
NodalScalarType dx_dxi(uint_t qp, uint_t x_i, uint_t xi_i) const
NodalScalarType dxi_dx(uint_t qp, uint_t x_i, uint_t xi_i) const
void set_compute_normal(bool f)
NodalScalarType xyz(uint_t qp, uint_t x_i) const
void compute_Jac(const ContextType &c, const FEBasisType &fe_basis, const Eigen::Matrix< NodalScalarType, SpatialDim, Eigen::Dynamic > &node_coord, Eigen::Matrix< NodalScalarType, SpatialDim *ElemDim, Eigen::Dynamic > &dx_dxi)
Eigen::Matrix< NodalScalarType, SpatialDim, Eigen::Dynamic > _node_coord
void set_compute_dphi_dx(bool f)
NodalScalarType tangent(uint_t qp, uint_t x_i) const
NodalScalarType detJ(uint_t qp) const
const dphi_dx_vec_t dphi_dx(uint_t qp, uint_t x_i) const
NodalScalarType dphi_dx(uint_t qp, uint_t phi_i, uint_t x_i) const
void reinit(const ContextType &c)
NodalScalarType detJxW(uint_t qp) const
Eigen::Matrix< NodalScalarType, SpatialDim, Eigen::Dynamic > _xyz
typename Eigen::Map< const typename Eigen::Matrix< NodalScalarType, SpatialDim, ElemDim > > dx_dxi_mat_t
static const uint_t spatial_dim
NodalScalarType nodal_scalar_t
void set_compute_Jac(bool f)
uint_t n_q_points() const
std::enable_if< Dim< 3, ScalarType >::typesource_load_multiplier(const SourceLoadFieldType *f, const SectionAreaType *s, ContextType &c) { Assert0(f, "Invalid pointer");Assert0(s, "Invalid pointer");return f-> value(c) *s -> value(c)
BasisScalarType basis_scalar_t
std::enable_if< ElemDim==SpatialDim &&ElemDim==1, void >::type compute_detJ_side(const ContextType &c, const uint_t s, const Eigen::Matrix< NodalScalarType, ElemDim *SpatialDim, Eigen::Dynamic > &dx_dxi, Eigen::Matrix< NodalScalarType, Eigen::Dynamic, 1 > &detJ)
typename fe_basis_t::phi_vec_t phi_vec_t
Eigen::Matrix< NodalScalarType, ElemDim *SpatialDim, Eigen::Dynamic > _dxi_dx
typename MAST::DeducedScalarType< BasisScalarType, NodalScalarType >::type scalar_t
NodalScalarType normal(uint_t qp, uint_t x_i) const
typename Eigen::Map< const typename Eigen::Matrix< NodalScalarType, ElemDim, SpatialDim > > dxi_dx_mat_t
Eigen::Matrix< NodalScalarType, SpatialDim, Eigen::Dynamic > _side_normal
static const uint_t ref_dim
void set_compute_xyz(bool f)
void compute_dphi_dx(const FEBasisType &fe_basis, const Eigen::Matrix< NodalScalarType, ElemDim *SpatialDim, Eigen::Dynamic > &dxi_dx, Eigen::Matrix< NodalScalarType, Eigen::Dynamic, Eigen::Dynamic > &dphi_dx)
std::enable_if< ElemDim==SpatialDim &&ElemDim==1, void >::type compute_side_tangent_and_normal(const ContextType &c, const uint_t s, const Eigen::Matrix< NodalScalarType, SpatialDim *ElemDim, Eigen::Dynamic > &dx_dxi, Eigen::Matrix< NodalScalarType, SpatialDim, Eigen::Dynamic > &tangent, Eigen::Matrix< NodalScalarType, SpatialDim, Eigen::Dynamic > &normal)
typename Eigen::Map< const typename Eigen::Matrix< NodalScalarType, Eigen::Dynamic, 1 > > dphi_dx_vec_t
dxi_dx_mat_t dxi_dx(uint_t qp) const
normal_vec_t normal(uint_t qp) const
Eigen::Matrix< NodalScalarType, SpatialDim *ElemDim, Eigen::Dynamic > _dx_dxi
#define Assert0(cond, msg)
void set_compute_Jac_inverse(bool f)
#define Assert2(cond, v1, v2, msg)
typename Eigen::Map< const typename Eigen::Matrix< NodalScalarType, Eigen::Dynamic, SpatialDim > > dphi_dx_mat_t
NodalScalarType node_coord(uint_t nd, uint_t x_i) const
const dphi_dx_mat_t dphi_dx(uint_t qp) const
void compute_detJxW(const FEBasisType &fe_basis, const Eigen::Matrix< NodalScalarType, Eigen::Dynamic, 1 > &detJ, Eigen::Matrix< NodalScalarType, Eigen::Dynamic, 1 > &detJxW)
void compute_xyz(const ContextType &c, const FEBasisType &fe_basis, Eigen::Matrix< NodalScalarType, SpatialDim, Eigen::Dynamic > &node_coord, Eigen::Matrix< NodalScalarType, SpatialDim, Eigen::Dynamic > &xyz)
Eigen::Matrix< NodalScalarType, Eigen::Dynamic, 1 > _detJ
Eigen::Matrix< NodalScalarType, Eigen::Dynamic, Eigen::Dynamic > _dphi_dx
typename Eigen::Map< const typename Eigen::Matrix< NodalScalarType, SpatialDim, 1 > > normal_vec_t
void set_compute_detJ(bool f)
dx_dxi_mat_t dx_dxi(uint_t qp) const
phi_vec_t phi(uint_t qp) const
void set_fe_basis(FEBasisType &basis)
void set_compute_detJxW(bool f)
BasisScalarType dphi_dxi(uint_t qp, uint_t phi_i, uint_t xi_i) const
Eigen::Matrix< NodalScalarType, Eigen::Dynamic, 1 > _detJxW
Eigen::Matrix< NodalScalarType, SpatialDim, Eigen::Dynamic > _side_tangent
BasisScalarType phi(uint_t qp, uint_t phi_i) const
void reinit_for_side(const ContextType &c, uint_t s)