state.hpp array limits serif/model/plan.hpp serif/model/state.hpp serif/backend/mfem/discretization/term_coefficients.hpp src/include/serif/backend/mfem/model/equilibrium_evaluator.hpp serif::model::backend::mfem::detail::StateCoefficients< Discretization, Layout, Prescribed, utils::dependencies::KeyList< Fields... > > serif serif::model serif::model::backend serif::model::backend::mfem serif::model::backend::mfem::detail #pragmaonce #include<array> #include<limits> #include"serif/model/plan.hpp" #include"serif/model/state.hpp" #include"serif/backend/mfem/discretization/term_coefficients.hpp" namespaceserif::model::backend::mfem::detail{ template<typenameInputs,typenameTerm> conceptCoefficientInput=requires(constInputs&inputs){ typenameInputs::Keys; {inputs.templateget<Term>().values}->std::convertible_to<const::mfem::Vector&>; requiresstd::same_as<typenamestd::remove_cvref_t<decltype(inputs.templateget<Term>().binding)>::Term,Term>; }; template<typenameInputs,typename...Terms> [[nodiscard]]constevalboolcoefficient_inputs(utils::dependencies::KeyList<Terms...>){ return(CoefficientInput<Inputs, Terms>&&...); } template<typenamePlan,typenameInputs> conceptPrescribedInputsFor=utils::dependencies::IsDependencyContext<Inputs>&& (utils::dependencies::key_count_v<utils::dependencies::CombinedKeyList<typename Plan::Values, typename Inputs::Keys>>== utils::dependencies::key_count_v<typename Plan::Values>+utils::dependencies::key_count_v<typename Inputs::Keys>)&& coefficient_inputs<Inputs>(typenamemodel::detail::RemoveKeys<typename Plan::Coefficients, typename Plan::Values>::Type{}); template<typenameDiscretization,typenameLayout,typenamePrescribed,typenameFields> classStateCoefficients; template<typenameDiscretization,typenameLayout,typenamePrescribed,typename...Fields> classStateCoefficients<Discretization,Layout,Prescribed,utils::dependencies::KeyList<Fields...>>final{ public: usingKeys=utils::dependencies::CombinedKeyList<utils::dependencies::KeyList<Fields...>,typenamePrescribed::Keys>; static_assert(utils::dependencies::key_count_v<Keys>==sizeof...(Fields)+utils::dependencies::key_count_v<typename Prescribed::Keys>, "Aphysicalfieldcannotbebothsolvedandprescribed.Removeitsprescribedinputoritssolvedcoordinate."); StateCoefficients(constDiscretization&discretization,constStellarState<Layout>&state,constPrescribed&prescribed): m_discretization(discretization),m_prescribed(prescribed),m_fields{field_view(state.templateget<Fields>())...}{ } [[nodiscard]]autocontext()const&{ usingnamespaceutils::dependencies; constautofields=make_dependency_context(own<Fields>(operators::backend::mfem::bind( m_discretization.templatebinding<Fields>(),m_fields[key_index<Fields,KeyList<Fields...>>()]))...); returncombine_dependency_contexts(fields,m_prescribed); } autocontext()const&&=delete; private: [[nodiscard]]static::mfem::Vectorfield_view(std::span<constdouble>values){ usingnamespaceutils::errors; serif_ensure<SERiFErrorCode::INVALID_DOF_COUNT>(values.size()<=static_cast<std::size_t>(std::numeric_limits<int>::max()), "AstellarfieldexceedsMFEM'scoefficientindexrange.Supplyarepresentablediscretization."); return::mfem::Vector(const_cast<double*>(values.data()),static_cast<int>(values.size())); } constDiscretization&m_discretization; constPrescribed&m_prescribed; std::array<::mfem::Vector,sizeof...(Fields)>m_fields; }; template<typenameDiscretization,typenameLayout,typenamePrescribed> [[nodiscard]]autostate_coefficients(constDiscretization&discretization,constStellarState<Layout>&state,constPrescribed&prescribed){ usingFields=typenamemodel::detail::RemoveKeys<typenameLayout::Values, utils::dependencies::KeyList<discretization::blocks::surface_deformation::coefficients>>::Type; returnStateCoefficients<Discretization, Layout, Prescribed, Fields>(discretization,state,prescribed); } }