docs(discretization/domain/schema/validation): updated docs and brought some imports over from the new backend/mfem

This commit is contained in:
2026-10-14 11:14:25 -04:00
parent c2ec94b9b7
commit 4c3a9ab3a2
5 changed files with 20 additions and 32 deletions

View File

@@ -4,11 +4,9 @@
* @file all.hpp * @file all.hpp
* @author Emily M. Boudreaux * @author Emily M. Boudreaux
* *
* @brief File containing the overloads of validate_schema which automatically distributes the mesh to the correct validation function based on the schema type * @brief File containing validate_schema, which selects the topology validators required by the schema type.
*/ */
#include <mfem.hpp>
#include "serif/discretization/domain/mesh/topology.hpp" #include "serif/discretization/domain/mesh/topology.hpp"
#include "serif/discretization/domain/schema/concepts.hpp" #include "serif/discretization/domain/schema/concepts.hpp"
#include "serif/discretization/domain/schema/validation/results.hpp" #include "serif/discretization/domain/schema/validation/results.hpp"
@@ -16,8 +14,8 @@
// Every RelationValidator specialization must be visible before // Every RelationValidator specialization must be visible before
// SchemaRelationValidator is instantiated, so they are all included here and // SchemaRelationValidator is instantiated, so they are all included here and
// validate_schema is defined only in this header. Include this file to validate // the topology overload of validate_schema is defined here. Include this file
// a mesh; including validator.hpp alone is not enough. // to validate topology; including validator.hpp alone is not enough.
#include "serif/discretization/domain/schema/validation/boundary.hpp" #include "serif/discretization/domain/schema/validation/boundary.hpp"
#include "serif/discretization/domain/schema/validation/connected.hpp" #include "serif/discretization/domain/schema/validation/connected.hpp"
#include "serif/discretization/domain/schema/validation/inscribed.hpp" #include "serif/discretization/domain/schema/validation/inscribed.hpp"
@@ -36,19 +34,4 @@ namespace serif::discretization::domain::schema::validation {
return SchemaRelationValidator<SchemaT, RelationsT>::validate(topology); return SchemaRelationValidator<SchemaT, RelationsT>::validate(topology);
} }
/**
* @brief Validate a mesh against a schema.
*
* @tparam SchemaT The schema type to validate against.
* @param mfemMesh The MFEM mesh to validate.
* @return A SchemaValidationResult containing the validation results.
*
* @note This overload is provided for convenience. It constructs a MeshTopology from the given MFEM mesh and then calls the other overload of validate_schema. It
* may be more efficient to construct a MeshTopology once and reuse it for multiple validations, rather than constructing it each time.
*/
template <IsSchema SchemaT>
[[nodiscard]] SchemaValidationResult validate_schema(const mfem::Mesh &mfemMesh) {
const mesh::MeshTopology topology{mfemMesh};
return validate_schema<SchemaT>(topology);
}
} }

View File

@@ -66,10 +66,10 @@ namespace serif::discretization::domain::schema::validation {
if (domainElementCount == 0) { if (domainElementCount == 0) {
return { return {
.failure = RelationValidationFailure::DomainAbsent, .failure = RelationValidationFailure::DomainAbsent,
.connectedDiagnostics = std::make_optional<RelationValidationResult::ConnectedDiagnostics>({ .connectedDiagnostics = RelationValidationResult::ConnectedDiagnostics{
.domainElementCount = 0, .domainElementCount = 0,
.visitedElementCount = 0 .visitedElementCount = 0
})}; }};
} }
std::vector<bool> visited(static_cast<std::size_t>(elementCount), false); std::vector<bool> visited(static_cast<std::size_t>(elementCount), false);
@@ -102,9 +102,7 @@ namespace serif::discretization::domain::schema::validation {
if (visitedElementCount == domainElementCount) { if (visitedElementCount == domainElementCount) {
return { return {
.connectedDiagnostics = std::make_optional<RelationValidationResult::ConnectedDiagnostics>( .connectedDiagnostics = RelationValidationResult::ConnectedDiagnostics{.domainElementCount = domainElementCount, .visitedElementCount = visitedElementCount}
{.domainElementCount = domainElementCount, .visitedElementCount = visitedElementCount}
)
}; };
} }
@@ -121,11 +119,11 @@ namespace serif::discretization::domain::schema::validation {
return { return {
.failure = RelationValidationFailure::DomainDisconnected, .failure = RelationValidationFailure::DomainDisconnected,
.connectedDiagnostics = std::make_optional<RelationValidationResult::ConnectedDiagnostics>({ .connectedDiagnostics = RelationValidationResult::ConnectedDiagnostics{
.elementID = disconnectedElementID, .elementID = disconnectedElementID,
.domainElementCount = domainElementCount, .domainElementCount = domainElementCount,
.visitedElementCount = visitedElementCount .visitedElementCount = visitedElementCount
})}; }};
} }
}; };
} }

View File

@@ -86,10 +86,10 @@ namespace serif::discretization::domain::schema::validation {
if (adjacentElementID < 0) { if (adjacentElementID < 0) {
return { return {
.failure = RelationValidationFailure::InnerDomainTouchesMeshBoundary, .failure = RelationValidationFailure::InnerDomainTouchesMeshBoundary,
.inscribedDiagnostics = std::make_optional<RelationValidationResult::InscribedDiagnostics>({ .inscribedDiagnostics = RelationValidationResult::InscribedDiagnostics{
.faceID = faceID, .faceID = faceID,
.innerElementID = innerElementID, .innerElementID = innerElementID,
})}; }};
} }
const int adjacentDomainID = topology.element_domain_id(adjacentElementID); const int adjacentDomainID = topology.element_domain_id(adjacentElementID);
@@ -97,12 +97,12 @@ namespace serif::discretization::domain::schema::validation {
if (!SchemaT::template domain_id_belongs_to<OuterT>(adjacentDomainID)) { if (!SchemaT::template domain_id_belongs_to<OuterT>(adjacentDomainID)) {
return { return {
.failure = RelationValidationFailure::InnerDomainTouchesUnexpectedDomain, .failure = RelationValidationFailure::InnerDomainTouchesUnexpectedDomain,
.inscribedDiagnostics = std::make_optional<RelationValidationResult::InscribedDiagnostics>({ .inscribedDiagnostics = RelationValidationResult::InscribedDiagnostics{
.faceID = faceID, .faceID = faceID,
.innerElementID = innerElementID, .innerElementID = innerElementID,
.adjacentElementID = adjacentElementID, .adjacentElementID = adjacentElementID,
.adjacentDomainID = adjacentDomainID .adjacentDomainID = adjacentDomainID
})}; }};
} }
} }

View File

@@ -0,0 +1,7 @@
#pragma once
#include "serif/backend/mfem/discretization/schema.hpp"
namespace serif::discretization::domain::schema::validation {
using serif::backend::mfem::discretization::validate_schema;
}

View File

@@ -45,7 +45,7 @@ namespace serif::discretization::domain::schema::validation {
* @tparam RelationTs The list of relations to validate. * @tparam RelationTs The list of relations to validate.
*/ */
template <IsSchema SchemaT, IsRelation... RelationTs> template <IsSchema SchemaT, IsRelation... RelationTs>
struct SchemaRelationValidator<SchemaT, RelationList<RelationTs...>> { struct SchemaRelationValidator<SchemaT, relation::lists::RelationList<RelationTs...>> {
/** /**
* @brief Validate a mesh against a schema, running one validator per declared relation in the schema. * @brief Validate a mesh against a schema, running one validator per declared relation in the schema.
* @param topology The mesh topology to validate against the schema. * @param topology The mesh topology to validate against the schema.