computations.hpp tuple type_traits utility serif/geometry/surface/detail/batches.hpp serif/utils/dependencies/computation_graph.hpp src/include/serif/geometry/surface/backend/mfem/boundary_computations.hpp src/include/serif/geometry/surface/surface.hpp serif serif::geometry serif::geometry::surface serif::geometry::surface::detail #pragmaonce #include<tuple> #include<type_traits> #include<utility> #include"serif/geometry/surface/detail/batches.hpp" #include"serif/utils/dependencies/computation_graph.hpp" namespaceserif::geometry::surface { namespacedetail { template<PressureSurfaceFormulationTypeFormulation,template<typename>typenameSampleKey,typename...Terms> [[nodiscard]]automake_surface_eos_computation(utils::dependencies::KeyList<Terms...>) { usingnamespaceutils::dependencies; usingEOS=typenameFormulation::EquationOfState; ifconstexpr(Formulation::resolves_carrier) { returnmake_computation<keys::EOSResponse,InputList<keys::EquationOfState,keys::PressureCondition,SampleKey<Terms>...>>( [](constEOS&equation_of_state,constIsobaricSurface&condition,constBoundaryValues<Terms>&...values) { returnevaluate_response_samples<Formulation>(equation_of_state,condition.target_pressure(),values...); }); } else { returnmake_computation<keys::EOSResponse,InputList<keys::EquationOfState,SampleKey<Terms>...>>( [](constEOS&equation_of_state,constBoundaryValues<Terms>&...values) { returnevaluate_response_samples<Formulation>(equation_of_state,dimensions::PressureValue{0.0},values...); }); } } template<PressureSurfaceFormulationTypeFormulation,template<typename>typenameSampleKey> [[nodiscard]]automake_surface_linearization_computation() { usingnamespaceutils::dependencies; usingResponses=std::vector<SurfaceEOSResponse<Formulation>>; ifconstexpr(Formulation::resolves_carrier) { usingCarrier=typenameFormulation::CarrierTerm; returnmake_computation<keys::Linearization,InputList<keys::EOSResponse,SampleKey<Carrier>>>( [](constResponses&responses,constBoundaryValues<Carrier>&carrier) { returnlinearize_carrier_samples<Formulation>(responses,carrier); }); } else { returnmake_computation<keys::Linearization,InputList<keys::EOSResponse,keys::PressureCondition>>( [](constResponses&responses,constIsobaricSurface&condition) { returnlinearize_pressure_samples<Formulation>(condition,responses); }); } } } template<PressureSurfaceFormulationTypeFormulation,template<typename>typenameSampleKey=std::type_identity_t> [[nodiscard]]automake_pressure_surface_computations() { returnstd::tuple{ detail::make_surface_eos_computation<Formulation, SampleKey>(typenameFormulation::EOSStateTerms{}), detail::make_surface_linearization_computation<Formulation, SampleKey>()}; } template<PressureSurfaceFormulationTypeFormulation> [[nodiscard]]automake_pressure_surface_graph() { returnstd::apply([](auto...computations) { returnutils::dependencies::make_computation_graph(std::move(computations)...); },make_pressure_surface_computations<Formulation>()); } template<typenameEOS,typenameBindings,typenameCarrier=void> requiresPressureSurfaceCompilable<EOS, Bindings, Carrier> [[nodiscard]]automake_pressure_surface_graph() { returnmake_pressure_surface_graph<PressureSurfaceFormulation<EOS, Bindings, Carrier>>(); } }