20 #ifndef __mast_fe_var_data_h__ 21 #define __mast_fe_var_data_h__ 31 template <
typename BasisScalarType,
32 typename NodalScalarType,
33 typename SolScalarType,
37 typename FEBasisDerivativeType>
44 using sol_vec_view_t = Eigen::Map<const typename Eigen::Matrix<scalar_t, NComponents, 1>>;
52 template <
typename AccessorType>
53 inline void init(
const ContextType& c,
54 const AccessorType& coeffs) {
72 Assert0(!
_fe,
"FE pointer already initialized.");
87 return _fe->n_q_points();
95 "Invalid component index");
106 "Invalid component index");
108 return _du_dx(x_i*NComponents+comp, qp);
113 template <
typename AccessorType>
115 const AccessorType& coeffs) {
118 n_coeffs = coeffs.size();
121 Assert2(n_coeffs ==
_fe->n_basis() * NComponents,
122 n_coeffs,
_fe->n_basis() * NComponents,
123 "Incompatible dimensions of coefficient vector");
125 _coeff_vec = Eigen::Matrix<scalar_t, Eigen::Dynamic, 1>::Zero(n_coeffs);
127 for (
uint_t i=0; i<n_coeffs; i++)
137 n_qp =
_fe->n_q_points(),
138 n_basis =
_fe->n_basis();
142 "Coefficients not initialized");
144 _u = Eigen::Matrix<scalar_t, NComponents, Eigen::Dynamic>::Zero(NComponents, n_qp);
147 for (
uint_t i=0; i<n_qp; i++)
148 for (
uint_t j=0; j<NComponents; j++)
149 for (
uint_t k=0; k<n_basis; k++)
154 _du_dx = Eigen::Matrix<scalar_t, NComponents*Dim, Eigen::Dynamic>::Zero(NComponents*Dim, n_qp);
156 for (
uint_t i=0; i<n_qp; i++)
157 for (
uint_t j=0; j<NComponents; j++)
158 for (
uint_t l=0; l<Dim; l++)
159 for (
uint_t k=0; k<n_basis; k++)
167 template <
typename VecType,
typename V=SolScalarType>
172 Assert2(i <= v.size(), i, v.size(),
"Invalid vector index");
178 const FEBasisDerivativeType *
_fe;
179 Eigen::Matrix<scalar_t, NComponents, Eigen::Dynamic>
_u;
180 Eigen::Matrix<scalar_t, NComponents*Dim, Eigen::Dynamic>
_du_dx;
188 #endif // __mast_fe_var_data_h__ const FEBasisDerivativeType * _fe
const FEBasisDerivativeType & get_fe_shape_data() const
FEBasisDerivativeType fe_shape_deriv_t
Eigen::Map< const typename Eigen::Matrix< scalar_t, NComponents, 1 > > sol_vec_view_t
uint_t n_q_points() const
void _init_variables(const ContextType &c)
Eigen::Matrix< scalar_t, NComponents *Dim, Eigen::Dynamic > _du_dx
std::enable_if< std::is_same< V, complex_t >::value, void >::type _add_complex_perturbation(VecType &v, uint_t i)
void _init_coefficients(const ContextType &c, const AccessorType &coeffs)
uint_t n_components() const
std::complex< real_t > complex_t
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)
void set_fe_shape_data(const FEBasisDerivativeType &fe)
Eigen::Matrix< scalar_t, Eigen::Dynamic, 1 > _coeff_vec
#define Assert0(cond, msg)
#define Assert2(cond, v1, v2, msg)
void clear_coeffs_and_vars()
Eigen::Matrix< scalar_t, NComponents, Eigen::Dynamic > _u
scalar_t du_dx(uint_t qp, uint_t comp, uint_t x_i) const
scalar_t u(uint_t qp, uint_t comp) const
void init(const ContextType &c, const AccessorType &coeffs)
void set_compute_du_dx(bool f)
typename MAST::DeducedScalarType< NodalScalarType, SolScalarType >::type scalar_t