boundary_data.hpp memory utility serif/backend/mfem/discretization/boundary_trace.hpp serif/geometry/surface/compilation.hpp serif/backend/mfem/discretization/term_coefficients.hpp src/include/serif/backend/mfem/geometry/surface/boundary_inputs.hpp src/include/serif/backend/mfem/geometry/surface/boundary_rows.hpp serif::geometry::surface::backend::mfem::PressureBoundary serif serif::geometry serif::geometry::surface serif::geometry::surface::backend serif::geometry::surface::backend::mfem serif::geometry::surface::backend::mfem::detail #pragmaonce #include<memory> #include<utility> #include"serif/backend/mfem/discretization/boundary_trace.hpp" #include"serif/geometry/surface/compilation.hpp" #include"serif/backend/mfem/discretization/term_coefficients.hpp" namespaceserif::geometry::surface::backend::mfem { namespacedetail { template<typename...Terms> [[nodiscard]]constevalboolsupported_boundary_terms(utils::dependencies::KeyList<Terms...>) { return(discretization::backend::mfem::BoundaryTraceTerm<Terms>&&...); } } template<typenameFormulation> conceptPressureBoundaryFormulation=PressureSurfaceFormulationType<Formulation>&& discretization::blocks::SpatialTerm<typename Formulation::Test>&& discretization::blocks::SpatialTermTraits<typename Formulation::Test>::family==discretization::functional_space::Family::h1&& detail::supported_boundary_terms(typenameFormulation::StateTerms{}); template<PressureBoundaryFormulationFormulationT,typenameTraces> structPressureBoundary { usingFormulation=FormulationT; std::shared_ptr<constdiscretization::backend::mfem::DofSelection>selected_rows; Tracestraces; voidvalidate()const { usingnamespaceutils::errors; serif_ensure<SERiFErrorCode::INVALID_ARGUMENT, std::invalid_argument>(selected_rows!=nullptr,"Anisobaricboundaryrequiresarowselection."); constautovalidate_traces=[&]<typename...Terms>(utils::dependencies::KeyList<Terms...>) { (traces.templateget<Terms>().validate(),...); serif_ensure<SERiFErrorCode::CACHE_FE_BINDING_ERROR, std::invalid_argument>(((&traces.templateget<Terms>().rows()==selected_rows.get())&&...),"Everypressure-boundarytracemustsamplethesameorderedequationrows."); }; validate_traces(typenameFormulation::StateTerms{}); } }; namespacedetail { template<PressureBoundaryFormulationFormulation,typenameCoefficients,typename...Terms> [[nodiscard]]automake_pressure_boundary(constCoefficients&coefficients,utils::dependencies::KeyList<Terms...>) { usingnamespaceutils::dependencies; usingnamespacediscretization::backend::mfem; usingRowBinding=std::remove_cvref_t<decltype(coefficients.templateget<typenameFormulation::Test>().binding)>; static_assert((std::same_as<typenameRowBinding::Schema,typenamestd::remove_cvref_t<decltype(coefficients.templateget<Terms>().binding)>::Schema>&&...),"Pressure-boundaryfieldsmustshareadomainschema."); constauto&row_binding=coefficients.templateget<typenameFormulation::Test>().binding; constautorows=std::make_shared<constDofSelection>(select_boundary_dofs<typenameFormulation::Support>(row_binding)); autotraces=make_dependency_context(own<Terms>(make_boundary_trace(rows,coefficients.templateget<Terms>().binding))...); usingBoundary=PressureBoundary<Formulation,decltype(traces)>; returnstd::make_shared<constBoundary>(Boundary{.selected_rows=rows,.traces=std::move(traces)}); } } template<PressureBoundaryFormulationFormulation,utils::dependencies::IsDependencyContextCoefficients> requiresutils::dependencies::SatisfiesKeyList<typename Coefficients::Bindings, typename Formulation::StateTerms> [[nodiscard]]automake_pressure_boundary(constCoefficients&coefficients) { returndetail::make_pressure_boundary<Formulation>(coefficients,typenameFormulation::StateTerms{}); } }