inscribed.hpp optional serif/discretization/domain/concepts.hpp serif/discretization/domain/mesh/topology.hpp serif/discretization/domain/relation/relations.hpp serif/discretization/domain/relation/validation/runtime.hpp serif/discretization/domain/schema/concepts.hpp serif/discretization/domain/schema/validation/validator.hpp src/include/serif/discretization/domain/schema/validation/all.hpp serif::discretization::domain::schema::validation::RelationValidator< Inscribed< InnerT, OuterT > > serif::discretization::domain::schema::validation::Inscribed serif serif::discretization serif::discretization::domain serif::discretization::domain::schema serif::discretization::domain::schema::validation File containing the specialization of RelationValidator for Inscribed relations. This relation enforces that an inner domain is inscribed within an outer domain, meaning that every face where the inner domain stops must have the outer domain on the far side. Emily M. Boudreaux #pragmaonce #include<optional> #include"serif/discretization/domain/concepts.hpp" #include"serif/discretization/domain/mesh/topology.hpp" #include"serif/discretization/domain/relation/relations.hpp" #include"serif/discretization/domain/relation/validation/runtime.hpp" #include"serif/discretization/domain/schema/concepts.hpp" #include"serif/discretization/domain/schema/validation/validator.hpp" //Inscribed<InnerT,OuterT>:everyfacewheretheinnerdomainstopsmusthave //theouterdomainonthefarside. namespaceserif::discretization::domain::schema::validation{ usingrelation::Inscribed; usingrelation::validation::RelationValidationResult; usingrelation::validation::RelationValidationFailure; template<IsDomainOrSetInnerT,IsDomainOrSetOuterT> structRelationValidator<Inscribed<InnerT,OuterT>>{ template<IsSchemaSchemaT> [[nodiscard]]staticRelationValidationResultvalidate(constmesh::MeshTopology&topology){ static_assert( SchemaT::templatecontains_domain<InnerT>(),"TheinnerdomainofanInscribedrelationisnotpresentinthesuppliedschema.Inscribedcannotbeenforced" ); static_assert( SchemaT::templatecontains_domain<OuterT>(),"TheouterdomainofanInscribedrelationisnotpresentinthesuppliedschema.Inscribedcannotbeenforced" ); boolfoundInnerElement=false; boolfoundOuterElement=false; boolfoundInnerBoundary=false; for(intelementID=0;elementID<topology.element_count();++elementID){ constintdomainID=topology.element_domain_id(elementID); foundInnerElement=foundInnerElement||SchemaT::templatedomain_id_belongs_to<InnerT>(domainID); foundOuterElement=foundOuterElement||SchemaT::templatedomain_id_belongs_to<OuterT>(domainID); } if(!foundInnerElement){ return{.failure=RelationValidationFailure::InnerDomainAbsent}; } if(!foundOuterElement){ return{.failure=RelationValidationFailure::OuterDomainAbsent}; } for(intfaceID=0;faceID<topology.face_count();++faceID){ constmesh::FaceElementsfaceElements=topology.face_elements(faceID); constintfirstElementID=faceElements.firstElementID; constintsecondElementID=faceElements.secondElementID; constboolfirstIsInner=firstElementID>=0&& SchemaT::templatedomain_id_belongs_to<InnerT>(topology.element_domain_id(firstElementID)); constboolsecondIsInner=secondElementID>=0&& SchemaT::templatedomain_id_belongs_to<InnerT>(topology.element_domain_id(secondElementID)); if(firstIsInner==secondIsInner){ continue; } foundInnerBoundary=true; constintinnerElementID=firstIsInner?firstElementID:secondElementID; constintadjacentElementID=firstIsInner?secondElementID:firstElementID; if(adjacentElementID<0){ return{ .failure=RelationValidationFailure::InnerDomainTouchesMeshBoundary, .inscribedDiagnostics=RelationValidationResult::InscribedDiagnostics{ .faceID=faceID, .innerElementID=innerElementID, }}; } constintadjacentDomainID=topology.element_domain_id(adjacentElementID); if(!SchemaT::templatedomain_id_belongs_to<OuterT>(adjacentDomainID)){ return{ .failure=RelationValidationFailure::InnerDomainTouchesUnexpectedDomain, .inscribedDiagnostics=RelationValidationResult::InscribedDiagnostics{ .faceID=faceID, .innerElementID=innerElementID, .adjacentElementID=adjacentElementID, .adjacentDomainID=adjacentDomainID }}; } } if(!foundInnerBoundary){ return{.failure=RelationValidationFailure::InnerDomainHasNoBoundary}; } return{}; } }; }