20 #ifndef __mast_libmesh_eigenproblem_assembly_h__ 21 #define __mast_libmesh_eigenproblem_assembly_h__ 31 #include <libmesh/nonlinear_implicit_system.h> 32 #include <libmesh/dof_map.h> 37 namespace libMeshWrapper {
39 template <
typename ScalarType,
46 "Scalar type of assembly and element operations must be same");
59 template <
typename VecType,
typename MatType,
typename ContextType>
71 sol_accessor(*c.sys, X);
73 using elem_vector_t =
typename ElemOpsType::vector_t;
74 using elem_matrix_t =
typename ElemOpsType::matrix_t;
82 libMesh::MeshBase::const_element_iterator
83 el = c.mesh->active_local_elements_begin(),
84 end_el = c.mesh->active_local_elements_end();
86 for ( ; el != end_el; ++el) {
91 sol_accessor.
init(*c.elem);
93 A_e.setZero(sol_accessor.
n_dofs(), sol_accessor.
n_dofs());
94 B_e.setZero(sol_accessor.
n_dofs(), sol_accessor.
n_dofs());
97 _e_ops->compute(c, sol_accessor, A_e, B_e);
102 <ScalarType, MatType, elem_matrix_t>
103 (A, c.sys->get_dof_map(), sol_accessor.
dof_indices(), A_e);
106 <ScalarType, MatType, elem_matrix_t>
107 (B, c.sys->get_dof_map(), sol_accessor.
dof_indices(), B_e);
119 template <
typename VecType,
121 typename ContextType,
122 typename ScalarFieldType>
124 const ScalarFieldType &f,
135 sol_accessor(*c.sys, X);
137 using elem_vector_t =
typename ElemOpsType::vector_t;
138 using elem_matrix_t =
typename ElemOpsType::matrix_t;
144 libMesh::MeshBase::const_element_iterator
145 el = c.mesh->active_local_elements_begin(),
146 end_el = c.mesh->active_local_elements_end();
148 for ( ; el != end_el; ++el) {
153 sol_accessor.
init(*c.elem);
155 A_e.setZero(sol_accessor.
n_dofs(), sol_accessor.
n_dofs());
156 B_e.setZero(sol_accessor.
n_dofs(), sol_accessor.
n_dofs());
159 _e_ops->derivative(c, f, sol_accessor, A_e, B_e);
164 <ScalarType, MatType, elem_matrix_t>
165 (A, c.sys->get_dof_map(), sol_accessor.
dof_indices(), A_e);
168 <ScalarType, MatType, elem_matrix_t>
169 (B, c.sys->get_dof_map(), sol_accessor.
dof_indices(), B_e);
191 #endif // __mast_libmesh_eigenproblem_assembly_h__ void set_finalize_jac(bool f)
void init(const libMesh::Elem &e)
void set_elem_ops(ElemOpsType &e_ops)
void sensitivity_assemble(ContextType &c, const ScalarFieldType &f, const VecType &X, MatType &A, MatType &B)
virtual ~EigenProblemAssembly()
void assemble(ContextType &c, const VecType &X, MatType &A, MatType &B)
void finalize(ValType &m)
const std::vector< libMesh::dof_id_type > & dof_indices() 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)
std::enable_if< std::is_same< ScalarType, real_t >::value, void >::type constrain_and_add_matrix(MatType &m, const libMesh::DofMap &dof_map, std::vector< libMesh::dof_id_type > &dof_indices, SubMatType &m_sub)