validation.hpp serif/model/description.hpp serif/model/detail/specification_endpoints.hpp serif/model/plan.hpp serif/operators/linearized_system_view.hpp src/compile_time_checks/serif/model/validation.cpp src/include/serif/model/execution_validation.hpp src/include/serif/model/model.hpp serif::model::detail::EquationCouplings< Equation, utils::types::TypeList< Columns... > > serif::model::detail::InteriorCouplings< equations::EquationRegistry< Equations... > > serif serif::model serif::model::detail #pragmaonce #include"serif/model/description.hpp" #include"serif/model/detail/specification_endpoints.hpp" #include"serif/model/plan.hpp" #include"serif/operators/linearized_system_view.hpp" namespaceserif::model { template<typenameRow,typenameField> usingDerivative=operators::PhysicalBlock<utils::dependencies::KeyList<Row>,utils::dependencies::KeyList<Field>>; template<utils::dependencies::IsBinding...Additional> usingSpecificationBindings=utils::dependencies::Bindings< utils::dependencies::Binding<state::Density,discretization::blocks::density::mass>, utils::dependencies::Binding<state::SurfaceShape,discretization::blocks::surface_deformation::coefficients>, utils::dependencies::Binding<state::GravitationalPotential,discretization::blocks::gravity::potential>, utils::dependencies::Binding<equation::PoissonBalance,discretization::blocks::gravity::potential>, utils::dependencies::Binding<equation::SurfaceShapeBalance,discretization::blocks::surface_deformation::shape_equilibrium>, utils::dependencies::Binding<equation::HydrostaticBalance,discretization::blocks::density::mass>, utils::dependencies::Binding<GeneratedCoordinateOf<FixedTotalMass>,discretization::blocks::barotropic_constant::mass_normalization>, utils::dependencies::Binding<ConstraintOf<FixedTotalMass>,discretization::blocks::barotropic_constant::mass_normalization>, utils::dependencies::Binding<GeneratedCoordinateOf<FixedAngularMomentum>,discretization::blocks::rotation::angular_velocity>, utils::dependencies::Binding<ConstraintOf<FixedAngularMomentum>,discretization::blocks::rotation::angular_velocity>,Additional...>; usingDefaultSpecificationBindings=SpecificationBindings<>; namespacedetail { template<typenameEquation,typenameColumns> structEquationCouplings; template<typenameEquation,typename...Columns> structEquationCouplings<Equation,utils::types::TypeList<Columns...>> { usingType=utils::dependencies::KeyList<Derivative<typename Equation::Test, typename Columns::term_type>...>; }; template<typenameRegistry> structInteriorCouplings; template<operators::VolumeEquation...Equations> structInteriorCouplings<equations::EquationRegistry<Equations...>> { usingType=utils::dependencies::CombinedKeyList<typename EquationCouplings<Equations, typename operators::EquationPlan<Equations>::Columns>::Type...>; }; template<DimensionalScalarSpecificationSpecification,typenameModel,typenameValues,typenameInputs,typenameRows,typenameInactiveRows,typenameBindings> [[nodiscard]]constevalboolvalid_specification_endpoints() { usingnamespaceutils::dependencies; usingEndpoints=ResolvedSpecification<Specification, Bindings>; ifconstexpr(!ContainsKey<typenameEndpoints::Coordinate,Values>||!ContainsKey<typenameEndpoints::Constraint,Rows>|| !Endpoints::Reads::templateowners_present<Model>||!Endpoints::Changes::templateowners_present<Model>) { returnfalse; } return[]<typename...Read,typename...Changed>(KeyList<Read...>,KeyList<Changed...>) { returnsizeof...(Read)!=0&&(ContainsKey<Read,Inputs>&&...)&&(ContainsKey<Changed,Rows>||...)&& ((ContainsKey<Changed,Rows>||ContainsKey<Changed,InactiveRows>)&&...); }(typenameEndpoints::Reads::Keys{},typenameEndpoints::Changes::Keys{}); } template<typenameModel,typenameValues,typenameInputs,typenameRows,typenameInactiveRows,typenameBindings,typename...Specifications> [[nodiscard]]constevalboolvalid_specifications(utils::types::TypeList<Specifications...>) { usingnamespaceutils::dependencies; constexprbooldeclarations=(((!GeneratesState<Specifications>::value&&std::same_as<typenameSpecifications::ModelDefinition::DependsOn,Reads<>>&& std::same_as<typenameSpecifications::ModelDefinition::Affects,Changes<>>)||DimensionalScalarSpecification<Specifications>)&&...); ifconstexpr(!declarations) { returnfalse; } else { return[]<typename...Generated>(utils::types::TypeList<Generated...>) { usingCoordinates=CombinedKeyList<KeyList<typenameResolvedSpecification<Generated,Bindings>::Coordinate>...>; usingResiduals=CombinedKeyList<KeyList<typenameResolvedSpecification<Generated,Bindings>::Constraint>...>; returnkey_count_v<Coordinates>==sizeof...(Generated)&&key_count_v<Residuals>==sizeof...(Generated)&& (valid_specification_endpoints<Generated, Model, Values, Inputs, Rows, InactiveRows, Bindings>()&&...); }(GeneratedSpecifications<Model>{}); } } template<DimensionalScalarSpecificationSpecification,typenameCouplings,typenameBindings> [[nodiscard]]constevalboolspecification_derivatives_available() { usingnamespaceutils::dependencies; usingEndpoints=ResolvedSpecification<Specification, Bindings>; return[]<typename...Read,typename...Changed>(KeyList<Read...>,KeyList<Changed...>) { constexprautochanged_row=[]<typenameRow>() { returnContainsKey<Derivative<Row,typenameEndpoints::Coordinate>,Couplings>&&(ContainsKey<Derivative<Row,Read>,Couplings>&&...); }; return(ContainsKey<Derivative<typename Endpoints::Constraint, Read>,Couplings>&&...)&&(changed_row.templateoperator()<Changed>()&&...); }(typenameEndpoints::Reads::Keys{},typenameEndpoints::Changes::Keys{}); } template<typenameCouplings,typenameBindings,typename...Specifications> [[nodiscard]]constevalboolspecification_derivatives_available(utils::types::TypeList<Specifications...>) { return(specification_derivatives_available<Specifications, Couplings, Bindings>()&&...); } }//namespacedetail template<ExecutableInteriorEquationsRegistry> usingDeclaredEquationCouplings=typenamedetail::InteriorCouplings<std::remove_cvref_t<Registry>>::Type; template<typenameModel,typenameValues,typenameInputs,typenameRows,typenameInactiveRows=utils::dependencies::KeyList<>,typenameBindings=DefaultSpecificationBindings> conceptSpecificationEndpointsValid=StellarModelType<Model>&&utils::dependencies::IsKeyList<Values>&&utils::dependencies::IsKeyList<Inputs>&& utils::dependencies::IsKeyList<Rows>&&utils::dependencies::IsKeyList<InactiveRows>&&utils::dependencies::IsBindings<Bindings>&& detail::valid_specifications<std::remove_cvref_t<Model>,Values,Inputs,Rows,InactiveRows,Bindings>(typenamestd::remove_cvref_t<Model>::SpecificationTypes{}); template<typenameModel,typenameValues,typenameRows,typenameDeclaredCouplings,typenameBindings=DefaultSpecificationBindings> conceptSpecificationTopologyValid=SpecificationEndpointsValid<Model, Values, Values, Rows, utils::dependencies::KeyList<>,Bindings>&& utils::dependencies::IsKeyList<DeclaredCouplings>&&detail::specification_derivatives_available<DeclaredCouplings, Bindings>(detail::GeneratedSpecifications<std::remove_cvref_t<Model>>{}); template<typenameModel,typenameValues,typenameRows,typenameDeclaredCouplings,typenameImplementedCouplings,typenameBindings=DefaultSpecificationBindings> conceptSpecificationBackendAvailable=SpecificationTopologyValid<Model, Values, Rows, DeclaredCouplings, Bindings>&& SpecificationTopologyValid<Model, Values, Rows, ImplementedCouplings, Bindings>; }//namespaceserif::model