boundary_trace.hpp memory utility mfem/linalg/sparsemat.hpp serif/backend/mfem/discretization/dof_selection.hpp src/include/serif/backend/mfem/geometry/surface/boundary_data.hpp src/lib/serif/backend/mfem/discretization/boundary_trace.cpp serif::discretization::backend::mfem::ScalarBoundaryTrace serif serif::discretization serif::discretization::backend serif::discretization::backend::mfem serif::discretization::backend::mfem::detail File containing the definition of the restricted dof space for a scalar boundary trace. Note in FEM a trace is a restriction on a function to the boundary of a domain. Therefore, This file contains the definitions for getting the DOFs at the boundary of a scalar field. Emily M. Boudreaux #pragmaonce #include<memory> #include<utility> #include"mfem/linalg/sparsemat.hpp" #include"serif/backend/mfem/discretization/dof_selection.hpp" namespaceserif::discretization::backend::mfem { template<typenameTermT> conceptBoundaryTraceTerm=blocks::ScalarTraceTerm<TermT>; classScalarBoundaryTrace; namespacedetail { [[nodiscard]]ScalarBoundaryTracebuild_boundary_trace(std::shared_ptr<constDofSelection>rows,constDofMap&input,const::mfem::FiniteElementSpace*input_space); } classScalarBoundaryTracefinal { public: [[nodiscard]]constDofMap&binding()constnoexcept; [[nodiscard]]constDofSelection&rows()constnoexcept; [[nodiscard]]const::mfem::SparseMatrix&interpolation()const; voidvalidate()const; private: ScalarBoundaryTrace(std::shared_ptr<constDofSelection>rows,constDofMap&input,std::shared_ptr<const::mfem::SparseMatrix>interpolation); friendScalarBoundaryTracedetail::build_boundary_trace(std::shared_ptr<constDofSelection>,constDofMap&,const::mfem::FiniteElementSpace*); std::shared_ptr<constDofSelection>m_rows; constDofMap&m_binding; std::shared_ptr<const::mfem::SparseMatrix>m_interpolation; }; template<BoundaryTraceTermTermT,domain::schema::IsSchemaSchemaT> [[nodiscard]]ScalarBoundaryTracemake_boundary_trace(std::shared_ptr<constDofSelection>rows,constTermBinding<TermT, SchemaT>&input) { ifconstexpr(blocks::GlobalScalarTerm<TermT>) { returndetail::build_boundary_trace(std::move(rows),input,nullptr); } else { returndetail::build_boundary_trace(std::move(rows),input,&input.space()); } } template<BoundaryTraceTermTermT,domain::schema::IsSchemaSchemaT> ScalarBoundaryTracemake_boundary_trace(std::shared_ptr<constDofSelection>,TermBinding<TermT,SchemaT>&&)=delete; template<BoundaryTraceTermTermT,domain::schema::IsSchemaSchemaT> ScalarBoundaryTracemake_boundary_trace(std::shared_ptr<constDofSelection>,constTermBinding<TermT,SchemaT>&&)=delete; }