execution_validation.hpp serif/model/equilibrium_plan.hpp serif/model/validation.hpp src/compile_time_checks/serif/model/barotropic_density.cpp src/compile_time_checks/serif/model/density_primal.cpp src/compile_time_checks/serif/model/execution_validation.cpp src/include/serif/backend/mfem/model/equilibrium.hpp serif::model::detail::CartesianCouplings< utils::dependencies::KeyList< Rows... >, utils::dependencies::KeyList< Fields... > > serif::model::detail::ExecutionSurface serif::model::detail::ExecutionSurface< Plan, std::void_t< typename Plan::Surface > > serif::model::detail::ExecutionInputs serif::model::detail::ExecutionInputs< Plan, std::void_t< typename Plan::PhysicalInputs, typename Plan::InactiveRows > > serif::model::detail::EquilibriumCouplings serif serif::model serif::model::detail #pragmaonce #include"serif/model/equilibrium_plan.hpp" #include"serif/model/validation.hpp" namespaceserif::model { namespacedetail { template<typenameRows,typenameFields> structCartesianCouplings; template<typename...Rows,typename...Fields> structCartesianCouplings<utils::dependencies::KeyList<Rows...>,utils::dependencies::KeyList<Fields...>> { template<typenameRow> usingForRow=utils::dependencies::KeyList<Derivative<Row, Fields>...>; usingType=utils::dependencies::CombinedKeyList<ForRow<Rows>...>; }; template<typenamePlan,typename=void> structExecutionSurface:SelectedSurface<void,false> { }; template<typenamePlan> structExecutionSurface<Plan,std::void_t<typenamePlan::Surface>>:Plan::Surface { }; template<typenamePlan,typename=void> structExecutionInputs { usingPhysicalInputs=typenamePlan::Values; usingInactiveRows=utils::dependencies::KeyList<>; }; template<typenamePlan> structExecutionInputs<Plan,std::void_t<typenamePlan::PhysicalInputs,typenamePlan::InactiveRows>> { usingPhysicalInputs=typenamePlan::PhysicalInputs; usingInactiveRows=typenamePlan::InactiveRows; }; template<DimensionalScalarSpecificationSpecification,typenameRows,typenameInactiveRows,typenameActual,typenameBindings> [[nodiscard]]constevalboolgenerated_physics_is_present() { usingnamespaceutils::dependencies; usingEndpoints=ResolvedSpecification<Specification, Bindings>; returnContainsKey<typenameEndpoints::Constraint,Rows>&&[]<typename...Changed>(KeyList<Changed...>) { return(((ContainsKey<Changed,InactiveRows>&&!ContainsKey<Changed,Rows>)||ContainsKey<Derivative<Changed, typename Endpoints::Coordinate>,Actual>)&&...); }(typenameEndpoints::Changes::Keys{}); } template<typenameRows,typenameInactiveRows,typenameActual,typenameBindings,typename...Specifications> [[nodiscard]]constevalboolgenerated_physics_are_present(utils::types::TypeList<Specifications...>) { return(generated_physics_is_present<Specifications, Rows, InactiveRows, Actual, Bindings>()&&...); } template<typenameRows,typename...Required> [[nodiscard]]constevalboolequation_rows_exist(utils::dependencies::KeyList<Required...>) { return(utils::dependencies::ContainsKey<Required,Rows>&&...); } }//namespacedetail template<typenameDescription> conceptExecutableEquilibriumDescription=EquilibriumEquationDescription<Description>&&ExecutableInteriorEquations<typename Description::InteriorEquations>&&requires { typenamedetail::ShapePlan<typename Description::ShapeForce>::Rows; requiresstd::same_as<typenameDescription::SurfaceCondition,NoSurfaceCondition>||std::same_as<typenameDescription::SurfaceCondition,geometry::surface::Isobaric>; requiresstd::same_as<typenameDescription::ShapeForce,NoShapeForce>|| std::same_as<typenameDescription::ShapeForce,equations::SurfacePotentialBalance>; }; namespacedetail { template<ExecutableEquilibriumDescriptionDescription,typenameSurface> structEquilibriumCouplings { usingInterior=InteriorPlan<typename Description::InteriorEquations>; usingShape=ShapePlan<typename Description::ShapeForce>; usingGeometryRows=std::conditional_t<std::same_as<typenameDescription::ShapeForce,NoShapeForce>,utils::dependencies::KeyList<>, utils::dependencies::CombinedKeyList<typename Interior::Rows, typename Shape::Rows>>; usingGeometry=typenameCartesianCouplings<GeometryRows, utils::dependencies::KeyList<discretization::blocks::surface_deformation::coefficients>>::Type; usingForce=typenameCartesianCouplings<typename Shape::Rows, typename Shape::Coefficients>::Type; usingType=utils::dependencies::CombinedKeyList<DeclaredEquationCouplings<typename Description::InteriorEquations>,Force,Geometry, typenameCartesianCouplings<typename Surface::Rows, typename Surface::Coefficients>::Type>; usingAuthoredRows=utils::dependencies::CombinedKeyList<typename Interior::Rows, typename Shape::Rows>; usingRequiredRows=utils::dependencies::CombinedKeyList<AuthoredRows, typename Surface::Rows>; }; }//namespacedetail template<ExecutableEquilibriumDescriptionDescription,typenamePlan> usingActualEquilibriumCouplings=typenamedetail::EquilibriumCouplings<Description, detail::ExecutionSurface<Plan>>::Type; template<typenameModel,typenameDescription,typenamePlan,typenameBindings=DefaultSpecificationBindings, typenameExplicitZeroCouplings=utils::dependencies::KeyList<>> [[nodiscard]]constevalboolexecutable_model_topology() { usingnamespaceutils::dependencies; ifconstexpr(!StellarModelType<Model>||!ExecutableEquilibriumDescription<Description>||!IsBindings<Bindings>||!IsKeyList<ExplicitZeroCouplings>) { returnfalse; } elseifconstexpr(!requires{typenamePlan::Values;typenamePlan::Residuals;}) { returnfalse; } elseifconstexpr(!IsKeyList<typenamePlan::Values>||!IsKeyList<typenamePlan::Residuals>) { returnfalse; } else { usingSurface=detail::ExecutionSurface<Plan>; usingInputs=detail::ExecutionInputs<Plan>; usingCouplings=detail::EquilibriumCouplings<Description, Surface>; ifconstexpr(!SpecificationEndpointsValid<Model, typename Plan::Values, typename Inputs::PhysicalInputs, typename Plan::Residuals, typename Inputs::InactiveRows, Bindings>) { returnfalse; } else { usingActual=CombinedKeyList<typenameCouplings::Type,ExplicitZeroCouplings>; return(std::same_as<typenameDescription::SurfaceCondition,NoSurfaceCondition>||Surface::supported)&& detail::equation_rows_exist<typename Plan::Residuals>(typenameCouplings::RequiredRows{})&& detail::generated_physics_are_present<typename Couplings::AuthoredRows, typename Inputs::InactiveRows, Actual, Bindings>(detail::GeneratedSpecifications<std::remove_cvref_t<Model>>{}); } } } }//namespaceserif::model