relations.hpp string_view serif/discretization/domain/concepts.hpp serif/utils/misc/concepts/numeric.hpp serif/utils/misc/std_helper/variadic_cleaning.hpp src/include/serif/discretization/domain/relation/concepts.hpp src/include/serif/discretization/domain/schema/schemas.hpp src/include/serif/discretization/domain/schema/validation/boundary.hpp src/include/serif/discretization/domain/schema/validation/connected.hpp src/include/serif/discretization/domain/schema/validation/inscribed.hpp serif::discretization::domain::relation::DomainRelation serif::discretization::domain::relation::Inscribed serif::discretization::domain::relation::FullyConnected serif::discretization::domain::relation::DomainBoundary serif serif::discretization serif::discretization::domain serif::discretization::domain::relation This file defines compile time tags for the relations that can be declared about a mesh in the domain module. These are ultimately used to define a constrained mesh schema. Emily M. Boudreaux Each relation must hold for a mesh to be considered valid for a given schema. This is intended to resolve some particular class of bug I imagine where a lively young astronomer confidently rolls up to SERiF with a new mesh in hand and a dream in their heart and then spend the next year trying to sort out esoteric errors. The idea here is that once a mesh gets through this system it should be provably at least good enough to be able to run some math against. That is not to say this validates the quality of a mesh, this system is not meant for that; rather, it is to say it lets be confident that the invariants we expect of a mesh are actually true. #pragmaonce #include<string_view> #include"serif/discretization/domain/concepts.hpp" #include"serif/utils/misc/concepts/numeric.hpp" #include"serif/utils/misc/std_helper/variadic_cleaning.hpp" //Therelationsaschemacandeclareaboutamesh.Eachoneisastatementthat //mustholdforthemeshtobeusable,andeachhasamatchingruntimecheckin //schema/validation/. namespaceserif::discretization::domain::relation{ usingutils::misc::concepts::SetOfOneOrTwo; usingutils::misc::std_helper::CountVariadicArguments; structDomainRelation{}; template<IsDomainOrSetA,IsDomainOrSetB> structInscribedfinal:DomainRelation{ usinginner_type=A; usingouter_type=B; staticconstexprstd::string_viewname="inscribed"; }; template<IsDomainOrSetA> structFullyConnectedfinal:DomainRelation{ usingdomain_type=A; staticconstexprstd::string_viewname="fully_connected"; }; template<IsBoundaryBoundaryT,IsDomainOrSet...DomainTs> requiresSetOfOneOrTwo<DomainTs...> structDomainBoundaryfinal:DomainRelation{ usingboundary_type=BoundaryT; usingdomain_types=DomainOrSetList<DomainTs...>; staticconstexprstd::size_tdomain_count=CountVariadicArguments<DomainTs...>(); staticconstexprstd::string_viewname="domain_boundary"; }; }