automatic.hpp serif/geometry/surface/detail/automatic_relations.hpp src/compile_time_checks/serif/geometry/surface_boundary.cpp src/include/serif/model/detail/surface_plan.hpp serif::geometry::surface::detail::SelectedPressureSurface serif::geometry::surface::detail::SelectedPressureSurface< std::tuple< Candidate > > serif::geometry::surface::AutomaticPressureSurface serif serif::geometry serif::geometry::surface serif::geometry::surface::detail #pragmaonce #include"serif/geometry/surface/detail/automatic_relations.hpp" namespaceserif::geometry::surface{ enumclassPressureSurfaceSelection{ supported, unavailable, ambiguous }; namespacedetail{ template<typenameField,typenameRows,typenameSolvedTerms,typenamePreferredField> conceptEligibleSurfaceRow=discretization::blocks::SpatialTerm<Field>&&discretization::blocks::HasResidualBlock<Field>&& utils::dependencies::ContainsKey<Field, Rows>&&utils::dependencies::ContainsKey<Field, SolvedTerms>&& (std::same_as<PreferredField,void>||std::same_as<PreferredField,Field>); template<intPriority,typenameEOS,typenameField,typenameFields,typenameRows,typenameSolvedTerms,typenamePreferredField> [[nodiscard]]constevalautofield_candidates(){ ifconstexpr(!EligibleSurfaceRow<Field, Rows, SolvedTerms, PreferredField>){ returnstd::tuple<>{}; } elseifconstexpr(Priority==0){ ifconstexpr(std::same_as<typenameField::Quantity,dimensions::Pressure>){ usingBindings=utils::dependencies::Bindings<utils::dependencies::Binding<dimensions::Pressure, Field>>; returnstd::tuple<std::type_identity<PressureFieldSurfaceFormulation<EOS,Bindings>>>{}; } else{ returnstd::tuple<>{}; } } elseifconstexpr(eos::models::EOSModel<EOS>){ returnrelation_candidates<Priority == 1, EOS, Field, Fields>(typenameEOS::Relations{}); } else{ returnstd::tuple<>{}; } } template<intPriority,typenameEOS,typenameRows,typenameSolvedTerms,typenamePreferredField,typename...Fields> [[nodiscard]]constevalautoselect_candidates(utils::dependencies::KeyList<Fields...>fields){ usingFieldsList=utils::dependencies::KeyList<Fields...>; usingCandidates=decltype(std::tuple_cat(field_candidates<Priority, EOS, Fields, FieldsList, Rows, SolvedTerms, PreferredField>()...)); ifconstexpr(std::tuple_size_v<Candidates>!=0||Priority==2){ returnCandidates{}; } else{ returnselect_candidates<Priority + 1, EOS, Rows, SolvedTerms, PreferredField>(fields); } } template<typenameCandidates> structSelectedPressureSurface{ staticconstexprPressureSurfaceSelectionstatus=std::tuple_size_v<Candidates>==0?PressureSurfaceSelection::unavailable:PressureSurfaceSelection::ambiguous; }; template<typenameCandidate> structSelectedPressureSurface<std::tuple<Candidate>>{ staticconstexprPressureSurfaceSelectionstatus=PressureSurfaceSelection::supported; usingFormulation=typenameCandidate::type; }; } template<typenameEOS,utils::dependencies::IsKeyListAvailableTerms,utils::dependencies::IsKeyListActualRows, utils::dependencies::IsKeyListSolvedTerms=AvailableTerms,typenamePreferredField=void> structAutomaticPressureSurface:detail::SelectedPressureSurface<decltype(detail::select_candidates<0,std::remove_cvref_t<EOS>,ActualRows,SolvedTerms,PreferredField>(detail::thermodynamic_fields(AvailableTerms{})))>{ }; template<typenameEOS,typenameAvailableTerms,typenameActualRows,typenameSolvedTerms=AvailableTerms,typenamePreferredField=void> conceptAutomaticPressureSurfaceCompilable=requires{typenameAutomaticPressureSurface<EOS, AvailableTerms, ActualRows, SolvedTerms, PreferredField>::Formulation;}; }