20 #ifndef __mast_linear_continuum_strain_energy_h__ 21 #define __mast_linear_continuum_strain_energy_h__ 28 namespace Elasticity {
29 namespace LinearContinuum {
32 template <
typename FEVarType,
33 typename SectionPropertyType,
42 using vector_t =
typename Eigen::Matrix<scalar_t, Eigen::Dynamic, 1>;
43 using matrix_t =
typename Eigen::Matrix<scalar_t, Eigen::Dynamic, Eigen::Dynamic>;
83 const typename FEVarType::fe_shape_deriv_t
86 typename Eigen::Matrix<scalar_t, n_strain, 1>
90 vec = vector_t::Zero(Dim*fe.n_basis());
92 typename SectionPropertyType::value_t
96 mat1 = matrix_t::Zero(
n_strain, Dim*fe.n_basis()),
97 mat2 = matrix_t::Zero(Dim*fe.n_basis(), Dim*fe.n_basis());
104 for (
uint_t i=0; i<fe.n_q_points(); i++) {
111 stress = mat * epsilon;
112 Bxmat.vector_mult_transpose(vec, stress);
113 res += fe.detJxW(i) * vec;
117 Bxmat.left_multiply(mat1, mat);
118 Bxmat.right_multiply_transpose(mat2, mat1);
119 (*jac) += fe.detJxW(i) * mat2;
124 template <
typename ScalarFieldType>
126 const ScalarFieldType& f,
133 const typename FEVarType::fe_shape_deriv_t
136 typename Eigen::Matrix<scalar_t, n_strain, 1>
140 vec = vector_t::Zero(Dim*fe.n_basis());
142 typename SectionPropertyType::value_t
145 mat1 = matrix_t::Zero(
n_strain, Dim*fe.n_basis()),
146 mat2 = matrix_t::Zero(Dim*fe.n_basis(), Dim*fe.n_basis());
153 for (
uint_t i=0; i<fe.n_q_points(); i++) {
160 stress = mat * epsilon;
161 Bxmat.vector_mult_transpose(vec, stress);
162 res += fe.detJxW(i) * vec;
166 Bxmat.left_multiply(mat1, mat);
167 Bxmat.right_multiply_transpose(mat2, mat1);
168 (*jac) += fe.detJxW(i) * mat2;
186 #endif // __mast_linear_continuum_strain_energy_h__ static const uint_t n_strain
void set_fe_var_data(const FEVarType &fe_data)
void derivative(ContextType &c, const ScalarFieldType &f, vector_t &res, matrix_t *jac=nullptr) const
typename Eigen::Matrix< scalar_t, Eigen::Dynamic, Eigen::Dynamic > matrix_t
typename FEVarType::scalar_t scalar_t
void compute(ContextType &c, vector_t &res, matrix_t *jac=nullptr) const
void set_section_property(const SectionPropertyType &p)
const SectionPropertyType * _property
typename FEVarType::fe_shape_deriv_t::scalar_t basis_scalar_t
typename FEVarType::fe_shape_deriv_t fe_shape_deriv_t
std::enable_if< Dim==2, void >::type strain(const FEVarType &fe_var, const uint_t qp, typename Eigen::Matrix< VarScalarType, 3, 1 > &epsilon, MAST::Numerics::FEMOperatorMatrix< NodalScalarType > &Bmat)
#define Assert0(cond, msg)
typename Eigen::Matrix< scalar_t, Eigen::Dynamic, 1 > vector_t
const FEVarType * _fe_var_data
void reinit(uint_t n_interpolated_vars, uint_t n_discrete_vars, uint_t n_discrete_dofs_per_var)
this initializes the operator for number of rows and variables, assuming that all variables has the s...