space.hpp type_traits format serif/meta/enums.hpp src/include/serif/backend/mfem/discretization/quadrature/order.hpp src/include/serif/discretization/blocks/fields.hpp src/include/serif/operators/concepts.hpp serif::discretization::functional_space::Rank serif::discretization::functional_space::SpaceDescriptor serif::discretization::functional_space::DiscreteFunctionalSpace std::formatter< serif::discretization::functional_space::Rank< R > > std::formatter< serif::discretization::functional_space::SpaceDescriptor > std::formatter< serif::discretization::functional_space::DiscreteFunctionalSpace< Space, Order, R > > std::formatter< serif::discretization::functional_space::Family > std::formatter< serif::discretization::functional_space::Continuity > std::formatter< serif::discretization::functional_space::Trace > std::formatter< serif::discretization::functional_space::Mapping > serif serif::discretization serif::discretization::functional_space This file defines the functional space types used in the discretization framework, including compile-time descriptors and runtime descriptors. Emily M. Boudreaux #pragmaonce #include<type_traits> #include<format> #include"serif/meta/enums.hpp" namespaceserif::discretization::functional_space{ template<std::size_tR> structRank{ constexprstaticstd::size_tvalue=R; }; enumclassFamily{ l2, h1, hdiv, hcurl }; inlinestaticautoFamily2StringMap=meta::enum_to_enum_string_map<Family>(); inlinestaticautoString2FamilyMap=meta::enum_to_string_enum_map<Family>(); enumclassContinuity{ discontinuous, continuous, normal_continuous, tangential_continuous }; inlinestaticautoContinuity2StringMap=meta::enum_to_enum_string_map<Continuity>(); inlinestaticautoString2ContinuityMap=meta::enum_to_string_enum_map<Continuity>(); enumclassTrace{ none, value, normal, tangential }; inlinestaticautoTrace2StringMap=meta::enum_to_enum_string_map<Trace>(); inlinestaticautoString2TraceMap=meta::enum_to_string_enum_map<Trace>(); enumclassMapping{ identity, contravariant_piola, covariant_piola }; inlinestaticautoMapping2StringMap=meta::enum_to_enum_string_map<Mapping>(); inlinestaticautoString2MappingMap=meta::enum_to_string_enum_map<Mapping>(); structSpaceDescriptorfinal{ constFamilyfamily; constContinuitycontinuity; constTracetrace; constMappingmapping; }; inlinestaticconstexprSpaceDescriptorL2{ .family=Family::l2, .continuity=Continuity::discontinuous, .trace=Trace::none, .mapping=Mapping::identity }; inlinestaticconstexprSpaceDescriptorH1{ .family=Family::h1, .continuity=Continuity::continuous, .trace=Trace::value, .mapping=Mapping::identity }; inlinestaticconstexprSpaceDescriptorHdiv{ .family=Family::hdiv, .continuity=Continuity::normal_continuous, .trace=Trace::normal, .mapping=Mapping::contravariant_piola }; inlinestaticconstexprSpaceDescriptorHcurl{ .family=Family::hcurl, .continuity=Continuity::tangential_continuous, .trace=Trace::tangential, .mapping=Mapping::covariant_piola }; template<SpaceDescriptorSpace,intOrder,std::size_tR> structDiscreteFunctionalSpace{ static_assert(Order>=0,"Finite-elementfamilyordermustbenon-negative."); static_assert((Space.family!=Family::hdiv&&Space.family!=Family::hcurl)||R==1,"H(div)andH(curl)spacesmustbevector-valued."); staticconstexprSpaceDescriptorfunctional_space=Space; staticconstexprintorder=Order; usingrank=Rank<R>; }; } template<std::size_tR> structstd::formatter<serif::discretization::functional_space::Rank<R>>:std::formatter<std::string>{ template<typenameFormatContext> autoformat(constserif::discretization::functional_space::Rank<R>&/*rank*/,FormatContext&ctx)const{ if(R==0){ returnstd::formatter<std::string>::format("Scalar",ctx); }elseif(R==1){ returnstd::formatter<std::string>::format("Vector",ctx); }elseif(R>=2){ returnstd::formatter<std::string>::format("Rank"+std::to_string(R)+"tensor",ctx); } } }; template<> structstd::formatter<serif::discretization::functional_space::SpaceDescriptor>:std::formatter<std::string>{ template<typenameFormatContext> autoformat(constserif::discretization::functional_space::SpaceDescriptor&space,FormatContext&ctx)const{ returnstd::formatter<std::string>::format(std::format("SpaceDescriptor(family={},continuity={},trace={},mapping={})", serif::discretization::functional_space::Family2StringMap.at(space.family), serif::discretization::functional_space::Continuity2StringMap.at(space.continuity), serif::discretization::functional_space::Trace2StringMap.at(space.trace), serif::discretization::functional_space::Mapping2StringMap.at(space.mapping)),ctx); } }; //formatterforDiscreteFunctionalSpace template<serif::discretization::functional_space::SpaceDescriptorSpace,intOrder,std::size_tR> structstd::formatter<serif::discretization::functional_space::DiscreteFunctionalSpace<Space,Order,R>>:std::formatter<std::string>{ template<typenameFormatContext> autoformat(constserif::discretization::functional_space::DiscreteFunctionalSpace<Space, Order, R>&space,FormatContext&ctx)const{ returnstd::formatter<std::string>::format(std::format("DiscreteFunctionalSpace(functional_space={},order={},rank={})", space.functional_space, space.order, serif::discretization::functional_space::Rank<R>{}),ctx); } }; template<> structstd::formatter<serif::discretization::functional_space::Family>:std::formatter<std::string>{ template<typenameFormatContext> autoformat(constserif::discretization::functional_space::Family&family,FormatContext&ctx)const{ returnstd::formatter<std::string>::format(serif::discretization::functional_space::Family2StringMap.at(family),ctx); } }; template<> structstd::formatter<serif::discretization::functional_space::Continuity>:std::formatter<std::string>{ template<typenameFormatContext> autoformat(constserif::discretization::functional_space::Continuity&continuity,FormatContext&ctx)const{ returnstd::formatter<std::string>::format(serif::discretization::functional_space::Continuity2StringMap.at(continuity),ctx); } }; template<> structstd::formatter<serif::discretization::functional_space::Trace>:std::formatter<std::string>{ template<typenameFormatContext> autoformat(constserif::discretization::functional_space::Trace&trace,FormatContext&ctx)const{ returnstd::formatter<std::string>::format(serif::discretization::functional_space::Trace2StringMap.at(trace),ctx); } }; template<> structstd::formatter<serif::discretization::functional_space::Mapping>:std::formatter<std::string>{ template<typenameFormatContext> autoformat(constserif::discretization::functional_space::Mapping&mapping,FormatContext&ctx)const{ returnstd::formatter<std::string>::format(serif::discretization::functional_space::Mapping2StringMap.at(mapping),ctx); } };