inputs.hpp serif/model/plan.hpp serif/backend/mfem/operators/volume_inputs.hpp src/include/serif/backend/mfem/model/binding.hpp serif serif::model serif::model::backend serif::model::backend::mfem serif::model::backend::mfem::detail #pragmaonce #include"serif/model/plan.hpp" #include"serif/backend/mfem/operators/volume_inputs.hpp" namespaceserif::model::backend::mfem { namespacedetail { template<typenameDiscretization,typenameCoefficients,typename...Terms> voidvalidate_coefficient_owners(constDiscretization&discretization,constCoefficients&coefficients,utils::dependencies::KeyList<Terms...>) { usingnamespaceutils::errors; constautovalidate=[&]<typenameTerm>() { serif_ensure<SERiFErrorCode::CACHE_FE_BINDING_ERROR>(std::addressof(coefficients.templateget<Term>().binding)==std::addressof(discretization.templatebinding<Term>()), "Stellarcoefficientsmustusetheexacttermbindingsretainedbytheirdiscretizationowner.Rebindthecoefficientvectorthroughthatdiscretizationbeforepreparingthemodel."); }; (validate.templateoperator()<Terms>(),...); } template<typenameDiscretization,typenameCoefficients,typename...Equations,typename...Fields> [[nodiscard]]automodel_inputs(constDiscretization&discretization,constCoefficients&coefficients, utils::types::TypeList<Equations...>,utils::dependencies::KeyList<Fields...>) { usingnamespaceutils::dependencies; usingnamespaceutils::errors; namespaceexecution=operators::backend::mfem; constauto*compactification_space=discretization.compactification.FESpace(); serif_ensure<SERiFErrorCode::CACHE_FE_BINDING_ERROR>(compactification_space!=nullptr, "Stellarcompactificationrequiresafinite-elementspace.Bindcompactificationtothemodelmeshbeforepreparingitsequations."); returnmake_dependency_context( execution::make_volume_binding_input<Equations,typenameEquations::Test>(discretization.templateequation_discretization<typenameEquations::Test>(),coefficients)..., own<execution::CompactificationCoefficients>(execution::MappingCoefficients{.binding=*compactification_space,.values=discretization.compactification},discretization::backend::mfem::CoefficientTracking{}), own<Fields>(coefficients.templateget<Fields>(),discretization::backend::mfem::CoefficientTracking{})...); } } template<ExecutableInteriorEquationsRegistry,typenameDiscretization,typenameCoefficients> [[nodiscard]]automake_model_inputs(constDiscretization&discretization,constCoefficients&coefficients) { usingPlan=ModelPlan<Registry>; detail::validate_coefficient_owners(discretization,coefficients,typenamePlan::Coefficients{}); returndetail::model_inputs(discretization,coefficients,typenameRegistry::Equations{},typenamePlan::Coefficients{}); } template<ExecutableInteriorEquationsRegistry,typenameDiscretization,typenameCoefficients> [[nodiscard]]automake_model_inputs(constDiscretization&discretization,constCoefficients&coefficients,const::mfem::Vector&displacement) { constautoinputs=make_model_inputs<Registry>(discretization,coefficients); constautoview=operators::backend::mfem::bind(discretization.templatebinding<discretization::blocks::displacement::vector>(),displacement); returnutils::dependencies::combine_dependency_contexts(inputs,utils::dependencies::make_dependency_context( utils::dependencies::own<operators::backend::mfem::DisplacementCoefficients>(view,discretization::backend::mfem::CoefficientTracking{}))); } template<typenameRegistry,typenameDiscretization,typenameCoefficients> voidmake_model_inputs(constDiscretization&,constCoefficients&,const::mfem::Vector&&)=delete; }