computations.hpp memory tuple vector serif/model/backend/mfem/normalized_system.hpp serif/model/keys.hpp serif/model/normalization/plan.hpp serif/solver/normalization/backend/mfem/metric_computations.hpp serif/solver/normalization/computations.hpp serif/geometry/deformation/backend/mfem/computations.hpp serif/geometry/surface/backend/mfem/boundary_inputs.hpp src/include/serif/model/backend/mfem/equilibrium.hpp serif::model::normalization::Configuration serif::model::normalization::PreparedSystem serif::model::normalization::detail::ConfigurationTracking serif::model::normalization::detail::VolumeMetric serif::model::normalization::detail::VolumeMetric< solver::normalization::ReferenceVolumeMetric< TermT > > serif serif::model serif::model::normalization serif::model::normalization::detail #pragmaonce #include<memory> #include<tuple> #include<vector> #include"serif/model/backend/mfem/normalized_system.hpp" #include"serif/model/keys.hpp" #include"serif/model/normalization/plan.hpp" #include"serif/solver/normalization/backend/mfem/metric_computations.hpp" #include"serif/solver/normalization/computations.hpp" #include"serif/geometry/deformation/backend/mfem/computations.hpp" #include"serif/geometry/surface/backend/mfem/boundary_inputs.hpp" namespaceserif::model::normalization{ structConfigurationfinal{}; structPreparedSystemfinal{}; namespacedetail{ structConfigurationTrackingfinal{ template<typenameOptions> [[nodiscard]]autocapture(conststd::shared_ptr<constOptions>&options)const{ returnoptions; } template<typenameOptions> [[nodiscard]]boolmatches(conststd::shared_ptr<constOptions>&snapshot,conststd::shared_ptr<constOptions>&options)const{ returnsnapshot==options; } template<typenameOptions> [[nodiscard]]constvoid*identity(conststd::shared_ptr<constOptions>&options)const{ returnoptions.get(); } }; template<typenameMetric> structVolumeMetric{ usingTerm=void; }; template<typenameTermT> structVolumeMetric<solver::normalization::ReferenceVolumeMetric<TermT>>{ usingTerm=TermT; }; template<typenameMetric,typenameDiscretization> [[nodiscard]]autometric_inputs(constDiscretization&discretization){ usingnamespaceutils::dependencies; usingTerm=typenameVolumeMetric<Metric>::Term; ifconstexpr(!std::same_as<Term,void>){ returnmake_dependency_context(solver::normalization::backend::mfem::reference_metric_binding(discretization.templatebinding<Term>())); }else{ returnmake_dependency_context(); } } template<typenameMetric,typenameDiscretization> [[nodiscard]]autometric_computations(constDiscretization&){ usingTerm=typenameVolumeMetric<Metric>::Term; ifconstexpr(!std::same_as<Term,void>){ usingBinding=std::remove_cvref_t<decltype(std::declval<constDiscretization&>().templatebinding<Term>())>; returnstd::tuple{solver::normalization::backend::mfem::make_reference_volume_metric_computation<Term, typename Binding::Schema>()}; }elseifconstexpr(std::same_as<Metric,geometry::deformation::keys::SurfaceMetric>){ returnstd::tuple{geometry::deformation::backend::mfem::make_surface_metric_computation()}; }else{ returnstd::tuple{}; } } } template<typenameOptions,typenameDiscretization,typename...Metrics> [[nodiscard]]automake_inputs(std::shared_ptr<constOptions>options,constDiscretization&discretization,utils::dependencies::KeyList<Metrics...>){ usingnamespaceutils::dependencies; constautoconfiguration=make_dependency_context(own<Configuration>(options,detail::ConfigurationTracking{})); returncombine_dependency_contexts(configuration,options->sources,detail::metric_inputs<Metrics>(discretization)...); } template<typenameNormalizationPlan,typenameBound,typenameOptions,typenameLayout,typename...Metrics> [[nodiscard]]automake_computations(constBound&bound,constOptions&options,constLayout&layout,utils::dependencies::KeyList<Metrics...>){ usingnamespaceutils::dependencies; namespacenumerical=solver::normalization; constautoscales=make_computation<numerical::keys::Scales,InputList<Configuration>>( [](conststd::shared_ptr<constOptions>&configuration){ usingnumerical::prepare_reference_scales; returnprepare_reference_scales(configuration->scheme,configuration->gravitational_constant); }); constautopacking=make_computation<numerical::keys::Layout,InputList<>>([layout](){ returnlayout; }); constautosurface=[&](){ ifconstexpr(Bound::Plan::has_surface){ returnstd::tuple{make_computation<SurfaceRows,InputList<geometry::surface::backend::mfem::keys::BoundaryDiscretization>>([](constauto&boundary){ constautorows=boundary->selected_rows->reduced_dofs(); returnstd::vector<int>(rows.begin(),rows.end()); })}; }else{ returnstd::tuple{}; } }(); constautoprepared=make_computation<PreparedSystem,InputList<keys::PhysicalSystem,numerical::keys::Normalization,numerical::keys::Scales>>( backend::mfem::make_normalized_system); returnstd::tuple_cat(std::tuple{scales,packing,prepared},surface, detail::metric_computations<Metrics>(*bound.discretization)..., numerical::make_normalization_computations<NormalizationPlan>(layout),options.computations); } }