20 #ifndef __mast_libmesh_output_sensitivity_h__ 21 #define __mast_libmesh_output_sensitivity_h__ 33 #include <libmesh/parallel.h> 39 namespace libMeshWrapper {
41 template <
typename ScalarType,
42 typename ResidualElemOpsType,
43 typename OutputElemOpsType>
48 static_assert(std::is_same<ScalarType,
49 typename ResidualElemOpsType::scalar_t>::
value,
50 "Scalar type of assembly and element operations must be same");
51 static_assert(std::is_same<ScalarType,
52 typename OutputElemOpsType::scalar_t>::
value,
53 "Scalar type of assembly and element operations must be same");
65 OutputElemOpsType &output_ops) {
75 template <
typename Vec1Type,
78 typename ScalarFieldType>
83 const Vec1Type &X_adj) {
93 sol_accessor (*c.sys, X),
94 adj_accessor (*c.sys, X_adj);
96 using elem_vector_t =
typename ResidualElemOpsType::vector_t;
97 using elem_matrix_t =
typename ResidualElemOpsType::matrix_t;
105 libMesh::MeshBase::const_element_iterator
106 el = c.mesh->active_local_elements_begin(),
107 end_el = c.mesh->active_local_elements_end();
111 for ( ; el != end_el; ++el) {
117 sol_accessor.init(*c.elem);
118 adj_accessor.
init(*c.elem);
120 dres_e.setZero(sol_accessor.n_dofs());
133 + adj_accessor.
dot(dres_e));
154 #endif // __mast_libmesh_output_sensitivity_h__
void init(const libMesh::Elem &e)
virtual ~OutputSensitivity()
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)
OutputElemOpsType * _output_e_ops
ScalarType assemble(ContextType &c, ScalarFieldType &f, const Vec1Type &X, const Vec1Type &X_adj)
output derivative is defined as a
#define Assert0(cond, msg)
void set_elem_ops(ResidualElemOpsType &e_ops, OutputElemOpsType &output_ops)
ScalarType dot(const Vec2Type &v) const
void comm_sum(const libMesh::Parallel::Communicator &comm, real_t &v)
ResidualElemOpsType * _e_ops
OutputSensitivity(libMesh::Communicator &comm)