physical_transfer.hpp memory optional tuple vector serif/discretization/blocks/traits.hpp serif/backend/mfem/shared/reference_tracking.hpp serif/backend/mfem/geometry/deformation/inputs.hpp src/include/serif/solver/continuation/equilibrium.hpp serif serif::solver serif::solver::backend serif::solver::backend::mfem #pragmaonce #include<memory> #include<optional> #include<tuple> #include<vector> #include"serif/discretization/blocks/traits.hpp" #include"serif/backend/mfem/shared/reference_tracking.hpp" #include"serif/backend/mfem/geometry/deformation/inputs.hpp" namespaceserif::solver::backend::mfem{ template<typenameBinding> [[nodiscard]]autobinding_identity(constBinding&binding){ binding.validate(); constauto&mesh=binding.mesh(); constautocommon=std::tuple{std::addressof(binding),std::addressof(mesh),mesh.GetSequence(),mesh.GetNodesSequence()}; ifconstexpr(discretization::blocks::SpatialTerm<typename Binding::Term>){ constauto&space=binding.space(); returnstd::tuple_cat(common,std::tuple{::serif::backend::mfem::shared::space_snapshot(space)}); }else{ returncommon; } } template<typenameFiniteElements> [[nodiscard]]autobinding_identities(constFiniteElements&finite_elements){ return[&]<typename...Key>(utils::dependencies::KeyList<Key...>){ returnstd::tuple{binding_identity(finite_elements.templatebinding<Key>())...}; }(typenamestd::remove_cvref_t<decltype(finite_elements.term_bindings)>::Keys{}); } template<typenameFiniteElements> [[nodiscard]]autophysical_transfer_guard(constFiniteElements&finite_elements){ autocommon=[owner=finite_elements.owner,bindings=binding_identities(finite_elements), compactification=&finite_elements.compactification,mapper=&finite_elements.mapper, compactification_space=finite_elements.compactification.FESpace(), compactification_values=std::vector<double>(finite_elements.compactification.begin(),finite_elements.compactification.end())] (constFiniteElements&next){ returnowner.get()==next.owner.get()&&compactification==&next.compactification&&mapper==&next.mapper&& compactification_space==next.compactification.FESpace()&&bindings==binding_identities(next)&& std::ranges::equal(compactification_values,next.compactification); }; ifconstexpr(requires{finite_elements.deformation.reference;}){ usingTracking=geometry::deformation::backend::mfem::ReferenceDiscretizationTracking; return[common=std::move(common),reference=Tracking{}.capture(finite_elements.deformation.reference), deformation=finite_elements.deformation.model](constFiniteElements&next){ returncommon(next)&&deformation==next.deformation.model&&Tracking{}.matches(reference,next.deformation.reference); }; }else{ returncommon; } } }