relations.hpp tuple type_traits serif/discretization/forms/value.hpp serif/eos/models/concepts.hpp serif/utils/dependencies/key_list_operations.hpp src/include/serif/geometry/surface/compilation.hpp serif::geometry::surface::detail::AreSurfaceBindings serif::geometry::surface::detail::AreSurfaceBindings< utils::dependencies::Bindings< Entries... > > serif::geometry::surface::detail::RelationQuantities< eos::relations::Relation< Output, Inputs... > > serif::geometry::surface::detail::MatchingPressureRelations< EOS, Bindings, Carrier, eos::relations::RelationCatalog< Relations... > > serif::geometry::surface::detail::SurfaceOperands< utils::dependencies::KeyList< Terms... > > serif::geometry::surface::detail::UniqueTerms< utils::types::TypeList< Terms... > > serif serif::geometry serif::geometry::surface serif::geometry::surface::detail #pragmaonce #include<tuple> #include<type_traits> #include"serif/discretization/forms/value.hpp" #include"serif/eos/models/concepts.hpp" #include"serif/utils/dependencies/key_list_operations.hpp" namespaceserif::geometry::surface{ template<typenameTerm> conceptSurfaceScalarTerm=discretization::blocks::Term<Term>&&requires{ typenamediscretization::forms::OperandValue<discretization::forms::Operand<Term>>; requiresstd::same_as<discretization::forms::OperandValue<discretization::forms::Operand<Term>>,double>; }; namespacedetail{ template<typenameBindings> structAreSurfaceBindings:std::false_type{ }; template<typename...Entries> structAreSurfaceBindings<utils::dependencies::Bindings<Entries...>>:std::bool_constant< sizeof...(Entries)!=0&&(dimensions::ThermodynamicQuantityType<typenameEntries::Key>&&...)&& (SurfaceScalarTerm<typenameEntries::Target>&&...)>{ }; } template<typenameBindings> conceptSurfaceStateBindings=utils::dependencies::IsBindings<Bindings>&&detail::AreSurfaceBindings<std::remove_cvref_t<Bindings>>::value; template<typenameBindings,typenameQuantity> conceptSurfaceResidualRow=utils::dependencies::BindingsWithBinding<Bindings, Quantity>&& discretization::blocks::HasResidualBlock<utils::dependencies::bound_type_t<Bindings, Quantity>>; namespacedetail{ template<typenameRelation> structRelationQuantities; template<typenameOutput,typename...Inputs> structRelationQuantities<eos::relations::Relation<Output,Inputs...>>{ usingAllInputs=utils::dependencies::KeyList<Inputs...>; usingNonPressureInputs=utils::dependencies::CombinedKeyList< std::conditional_t<std::same_as<Inputs,dimensions::Pressure>,utils::dependencies::KeyList<>,utils::dependencies::KeyList<Inputs>>...>; }; template<typenameEOS,typenameRelation,typename...Quantities> [[nodiscard]]constevalboolsupports_partials(utils::dependencies::KeyList<Quantities...>){ return(eos::models::EOSSupportingPartialDerivative<EOS, Relation, Quantities>&&...); } template<typenameEOS,typenameBindings,typenameCarrier,typenameRelation> [[nodiscard]]constevalboolmatches_pressure_relation(){ usingOutput=typenameRelation::OutputQuantity; usingInputs=typenameRelationQuantities<Relation>::NonPressureInputs; return!std::same_as<Output,dimensions::Pressure>&& (std::same_as<Carrier,void>||std::same_as<Carrier,Output>)&& eos::relations::RelationContainingInput<Relation, dimensions::Pressure>&& SurfaceResidualRow<Bindings, Output>&& utils::dependencies::SatisfiesKeyList<Bindings, Inputs>&&supports_partials<EOS, Relation>(Inputs{}); } template<typenameEOS,typenameBindings,typenameCarrier,typenameCatalog> structMatchingPressureRelations; template<typenameEOS,typenameBindings,typenameCarrier,typename...Relations> structMatchingPressureRelations<EOS,Bindings,Carrier,eos::relations::RelationCatalog<Relations...>>{ usingMatches=decltype(std::tuple_cat(std::declval<std::conditional_t<matches_pressure_relation<EOS, Bindings, Carrier, Relations>(),std::tuple<Relations>,std::tuple<>>>()...)); staticconstexprstd::size_tcount=std::tuple_size_v<Matches>; }; template<typenameTerms> structSurfaceOperands; template<typename...Terms> structSurfaceOperands<utils::dependencies::KeyList<Terms...>>{ usingType=utils::types::TypeList<discretization::forms::Operand<Terms>...>; }; template<typenameTerms> structUniqueTerms; template<typename...Terms> structUniqueTerms<utils::types::TypeList<Terms...>>{ usingType=utils::dependencies::CombinedKeyList<utils::dependencies::KeyList<Terms>...>; }; template<typenameBindings,typenameQuantities> usingBoundTerms=typenameUniqueTerms<utils::dependencies::ResolvedTargets<Bindings, Quantities>>::Type; } }