surface.cpp type_traits serif/eos/models/polytropic.hpp serif/geometry/surface/surface.hpp serif/utils/dependencies/computation_cache.hpp #include<type_traits> #include"serif/eos/models/polytropic.hpp" #include"serif/geometry/surface/surface.hpp" #include"serif/utils/dependencies/computation_cache.hpp" namespace{ namespacesurface=serif::geometry::surface; namespacedependencies=serif::utils::dependencies; namespacequantities=serif::dimensions; namespaceeos=serif::eos; namespaceblocks=serif::discretization::blocks; structEnthalpy:blocks::term<blocks::density>{ usingFunctionalSpace=serif::discretization::functional_space::DiscreteFunctionalSpace<serif::discretization::functional_space::H1,3,0>; usingSupport=serif::discretization::domain::StellarDomains; usingQuantity=quantities::SpecificEnthalpy; structvaluefinal:blocks::value_block_base{}; structresidualfinal:blocks::residual_block_base{}; }; usingDensity=blocks::density::mass; usingBarotropic=dependencies::Bindings<dependencies::Binding<quantities::SpecificEnthalpy,Enthalpy>>; usingDensityState=dependencies::Bindings<dependencies::Binding<quantities::MassDensity,Density>>; usingBothCarriers=dependencies::Bindings<dependencies::Binding<quantities::SpecificEnthalpy,Enthalpy>,dependencies::Binding<quantities::MassDensity,Density>>; usingDensityFromPressure=eos::relations::Relation<quantities::MassDensity,quantities::Pressure>; usingDensityFromPressureAndEnthalpy=eos::relations::Relation<quantities::MassDensity,quantities::SpecificEnthalpy,quantities::Pressure>; structTwoCarriers{ usingRelations=eos::relations::RelationCatalog<DensityFromPressure,eos::relations::SpecificEnthalpyFromPressure>; quantities::DensityValueevaluate(DensityFromPressure,quantities::PressureValue)const; quantities::SpecificEnthalpyValueevaluate(eos::relations::SpecificEnthalpyFromPressure,quantities::PressureValue)const; }; structReversedCarriers:TwoCarriers{ usingRelations=eos::relations::RelationCatalog<eos::relations::SpecificEnthalpyFromPressure,DensityFromPressure>; }; structGeneralEOS{ usingRelations=eos::relations::RelationCatalog<DensityFromPressureAndEnthalpy>; quantities::DensityValueevaluate(DensityFromPressureAndEnthalpy,quantities::SpecificEnthalpyValue,quantities::PressureValue)const; quantities::PartialDerivative<quantities::MassDensity,quantities::SpecificEnthalpy>partial_derivative(DensityFromPressureAndEnthalpy,quantities::WithRespectTo<quantities::SpecificEnthalpy>,quantities::SpecificEnthalpyValue,quantities::PressureValue)const; }; structMissingPartial{ usingRelations=eos::relations::RelationCatalog<DensityFromPressureAndEnthalpy>; quantities::DensityValueevaluate(DensityFromPressureAndEnthalpy,quantities::SpecificEnthalpyValue,quantities::PressureValue)const; }; structAmbiguousEOS:GeneralEOS{ usingRelations=eos::relations::RelationCatalog<DensityFromPressureAndEnthalpy,DensityFromPressure>; usingGeneralEOS::evaluate; quantities::DensityValueevaluate(DensityFromPressure,quantities::PressureValue)const; }; structForwardOnly{ usingRelations=eos::relations::RelationCatalog<eos::relations::PressureFromDensity>; quantities::PressureValueevaluate(eos::relations::PressureFromDensity,quantities::DensityValue)const; quantities::PartialDerivative<quantities::Pressure,quantities::MassDensity>partial_derivative(eos::relations::PressureFromDensity,quantities::WithRespectTo<quantities::MassDensity>,quantities::DensityValue)const; }; usingTwoStateRelation=eos::relations::Relation<quantities::SpecificEnthalpy,quantities::Pressure,quantities::Entropy,quantities::Temperature>; usingTwoStateBindings=dependencies::Bindings<dependencies::Binding<quantities::SpecificEnthalpy,Enthalpy>,dependencies::Binding<quantities::Entropy,Density>,dependencies::Binding<quantities::Temperature,Density>>; structMissingSecondPartial{ usingRelations=eos::relations::RelationCatalog<TwoStateRelation>; quantities::SpecificEnthalpyValueevaluate(TwoStateRelation,quantities::PressureValue,quantities::EntropyValue,quantities::TemperatureValue)const; quantities::PartialDerivative<quantities::SpecificEnthalpy,quantities::Entropy>partial_derivative(TwoStateRelation,quantities::WithRespectTo<quantities::Entropy>,quantities::PressureValue,quantities::EntropyValue,quantities::TemperatureValue)const; }; structCompletePartials:MissingSecondPartial{ usingMissingSecondPartial::partial_derivative; quantities::PartialDerivative<quantities::SpecificEnthalpy,quantities::Temperature>partial_derivative(TwoStateRelation,quantities::WithRespectTo<quantities::Temperature>,quantities::PressureValue,quantities::EntropyValue,quantities::TemperatureValue)const; }; structSampleOnlyTerm:blocks::term<blocks::density>{ usingFunctionalSpace=Enthalpy::FunctionalSpace; usingSupport=Enthalpy::Support; }; template<typenameCandidate> conceptSelectsCarrier=requires{ typenameCandidate::CarrierQuantity; }; template<typenameEOS,typenameBindings> conceptHasSurfaceRelation=requires{ typenamesurface::pressure_relation_t<EOS,Bindings>; }; static_assert(std::same_as<surface::IsobaricSurface::PhysicalQuantity,quantities::Pressure>); static_assert(std::same_as<surface::Isobaric,surface::IsobaricSurface>); static_assert(std::constructible_from<surface::IsobaricSurface,quantities::PressureValue>); static_assert(!std::constructible_from<surface::IsobaricSurface,quantities::SpecificEnthalpyValue>); static_assert(!std::constructible_from<surface::IsobaricSurface,double>); static_assert(!SelectsCarrier<surface::IsobaricSurface>); static_assert(std::is_trivially_copyable_v<surface::IsobaricSurface>); static_assert(std::is_trivially_copyable_v<surface::PressureSurfaceDescriptor>); usingDuplicateQuantities=dependencies::Bindings<dependencies::Binding<quantities::SpecificEnthalpy,Enthalpy>,dependencies::Binding<quantities::SpecificEnthalpy,Density>>; usingSharedTarget=dependencies::Bindings<dependencies::Binding<quantities::SpecificEnthalpy,Enthalpy>,dependencies::Binding<quantities::MassDensity,Enthalpy>>; usingVectorCarrier=dependencies::Bindings<dependencies::Binding<quantities::SpecificEnthalpy,blocks::displacement::vector>>; usingInvalidQuantity=dependencies::Bindings<dependencies::Binding<int,Enthalpy>>; static_assert(surface::SurfaceStateBindings<Barotropic>); static_assert(surface::SurfaceStateBindings<constBothCarriers&>); static_assert(surface::SurfaceStateBindings<SharedTarget>); static_assert(!surface::SurfaceStateBindings<DuplicateQuantities>); static_assert(!surface::SurfaceStateBindings<VectorCarrier>); static_assert(!surface::SurfaceStateBindings<InvalidQuantity>); static_assert(!surface::SurfaceStateBindings<dependencies::Bindings<>>); static_assert(!surface::SurfaceStateBindings<int>); static_assert(surface::SurfaceScalarTerm<SampleOnlyTerm>); static_assert(!surface::PressureSurfaceCompilable<TwoCarriers,dependencies::Bindings<dependencies::Binding<quantities::SpecificEnthalpy,SampleOnlyTerm>>>); static_assert(surface::PressureSurfaceCompilable<eos::models::Polytrope,Barotropic>); static_assert(surface::PressureSurfaceCompilable<consteos::models::Polytrope&,constBarotropic&>); static_assert(!surface::PressureSurfaceCompilable<ForwardOnly,DensityState>); static_assert(!surface::PressureSurfaceCompilable<int,Barotropic>); static_assert(!surface::PressureSurfaceCompilable<TwoCarriers,int>); static_assert(!surface::PressureSurfaceCompilable<TwoCarriers,DuplicateQuantities>); static_assert(!surface::PressureSurfaceCompilable<TwoCarriers,VectorCarrier>); static_assert(!HasSurfaceRelation<TwoCarriers, int>); static_assert(!HasSurfaceRelation<TwoCarriers, BothCarriers>); static_assert(!HasSurfaceRelation<int, Barotropic>); static_assert(surface::PressureSurfaceCompilable<TwoCarriers,DensityState>); static_assert(surface::PressureSurfaceCompilable<TwoCarriers,Barotropic>); static_assert(!surface::PressureSurfaceCompilable<TwoCarriers,BothCarriers>); static_assert(!surface::PressureSurfaceCompilable<ReversedCarriers,BothCarriers>); static_assert(surface::PressureSurfaceCompilable<TwoCarriers,BothCarriers,quantities::MassDensity>); static_assert(surface::PressureSurfaceCompilable<TwoCarriers,BothCarriers,quantities::SpecificEnthalpy>); static_assert(!surface::PressureSurfaceCompilable<TwoCarriers,BothCarriers,quantities::Temperature>); static_assert(surface::PressureSurfaceCompilable<GeneralEOS,BothCarriers>); static_assert(!surface::PressureSurfaceCompilable<GeneralEOS,DensityState>); static_assert(!surface::PressureSurfaceCompilable<MissingPartial,BothCarriers>); static_assert(!surface::PressureSurfaceCompilable<MissingSecondPartial,TwoStateBindings>); static_assert(surface::PressureSurfaceCompilable<CompletePartials,TwoStateBindings>); static_assert(!surface::PressureSurfaceCompilable<AmbiguousEOS,BothCarriers,quantities::MassDensity>); usingGeneral=surface::PressureSurfaceFormulation<GeneralEOS,BothCarriers>; usingShared=surface::PressureSurfaceFormulation<GeneralEOS,SharedTarget>; static_assert(std::same_as<General::CarrierQuantity,quantities::MassDensity>); static_assert(std::same_as<General::CarrierTerm,Density>); static_assert(std::same_as<General::StateQuantities,dependencies::KeyList<quantities::MassDensity,quantities::SpecificEnthalpy>>); static_assert(std::same_as<General::StateTerms,dependencies::KeyList<Density,Enthalpy>>); static_assert(std::same_as<General::EOSStateTerms,dependencies::KeyList<Enthalpy>>); static_assert(std::same_as<Shared::StateQuantities,General::StateQuantities>); static_assert(std::same_as<Shared::StateTerms,dependencies::KeyList<Enthalpy>>); static_assert(surface::DirectPressureSurfaceCompilable<ForwardOnly,DensityState,quantities::MassDensity,eos::relations::PressureFromDensity>); static_assert(!surface::DirectPressureSurfaceCompilable<ForwardOnly,DensityState,quantities::Temperature,eos::relations::PressureFromDensity>); static_assert(!surface::DirectPressureSurfaceCompilable<ForwardOnly,DensityState,quantities::MassDensity,DensityFromPressure>); static_assert(!surface::DirectPressureSurfaceCompilable<ForwardOnly,DensityState,quantities::MassDensity,int>); static_assert(!surface::DirectPressureSurfaceCompilable<int,DensityState,quantities::MassDensity,eos::relations::PressureFromDensity>); usingDirect=surface::DirectPressureSurfaceFormulation<ForwardOnly,DensityState,quantities::MassDensity,eos::relations::PressureFromDensity>; static_assert(std::same_as<Direct::ResidualQuantity,quantities::Pressure>); static_assert(std::same_as<Direct::CarrierTerm,Density>); static_assert(!Direct::resolves_carrier); static_assert(surface::PressureSurfaceFormulationType<Direct>); static_assert(!surface::PressureSurfaceFormulationType<int>); usingGraph=decltype(surface::make_pressure_surface_graph<eos::models::Polytrope,Barotropic>()); usingEOSContext=decltype(dependencies::make_dependency_context(dependencies::borrow<surface::keys::EquationOfState>(std::declval<eos::models::Polytrope&>()))); static_assert(!dependencies::CanPrepare<Graph,EOSContext,surface::SurfaceFailure>); static_assert(!std::copy_constructible<decltype(dependencies::make_computation_cache<surface::SurfaceFailure>( surface::make_pressure_surface_graph<eos::models::Polytrope,Barotropic>(), dependencies::make_dependency_context( dependencies::borrow<surface::keys::EquationOfState>(std::declval<eos::models::Polytrope&>(),dependencies::track_by([](constauto&model){ returnstd::pair{model.polytropic_index(),model.polytropic_constant()}; })), surface::pressure_condition(std::declval<surface::IsobaricSurface>()), surface::boundary_values<Enthalpy>({0.4}) )))>); }