geometry_inspection.hpp expected span utility mfem/fem/fespace.hpp serif/geometry/deformation/geometry_inspection.hpp serif/geometry/deformation/linearization.hpp src/compile_time_checks/serif/geometry/deformation.cpp src/lib/serif/geometry/deformation/backend/mfem/geometry_inspection.cpp serif serif::discretization serif::discretization::backend serif::discretization::backend::mfem serif::mapping serif::geometry serif::geometry::deformation serif::geometry::deformation::backend serif::geometry::deformation::backend::mfem #pragmaonce #include<expected> #include<span> #include<utility> #include"mfem/fem/fespace.hpp" #include"serif/geometry/deformation/geometry_inspection.hpp" #include"serif/geometry/deformation/linearization.hpp" namespaceserif::discretization::backend::mfem { classTensorBasisCache; } namespaceserif::mapping { classDomainMapper; } namespaceserif::geometry::deformation::backend::mfem { [[nodiscard]]std::expected<DeformationGeometryReport,DeformationFailure>inspect_deformation_geometry(const::mfem::FiniteElementSpace&displacement_space,const::mfem::Vector&displacement); [[nodiscard]]std::expected<DeformationGeometryReport,DeformationFailure>inspect_deformation_geometry(const::mfem::FiniteElementSpace&displacement_space,const::mfem::Vector&displacement,discretization::backend::mfem::TensorBasisCache&basis_cache,constmapping::DomainMapper*reference_geometry=nullptr); [[nodiscard]]std::expected<DeformationGeometryReport,DeformationFailure>inspect_deformation_geometry(const::mfem::FiniteElementSpace&displacement_space,std::span<constdouble>displacement,::mfem::Ordering::Typecoefficient_ordering); [[nodiscard]]std::expected<DeformationGeometryReport,DeformationFailure>inspect_deformation_geometry(const::mfem::FiniteElementSpace&displacement_space,std::span<constdouble>displacement,::mfem::Ordering::Typecoefficient_ordering,discretization::backend::mfem::TensorBasisCache&basis_cache,constmapping::DomainMapper*reference_geometry=nullptr); template<DeformationMapMap> requiresstd::same_as<typenameMap::OutputSpace,spaces::VolumeDisplacement> [[nodiscard]]std::expected<ValidatedDisplacement,DeformationFailure>build_validated_displacement(constMap&map,std::span<constdouble>parameters,const::mfem::FiniteElementSpace&displacement_space,constdoubledeterminant_floor=0.0) { if(!std::isfinite(determinant_floor)||determinant_floor<0.0) { returnstd::unexpected(DeformationFailure{.reason=DeformationFailureReason::invalid_configuration,.message="Deformationgeometryvalidationrequiresafinite,nonnegativedeterminantfloor."}); } autodisplacement=evaluate_displacement(map,parameters); if(!displacement) { returnstd::unexpected(displacement.error()); } constautogeometry=inspect_deformation_geometry(displacement_space,*displacement,::mfem::Ordering::byNODES); if(!geometry) { returnstd::unexpected(geometry.error()); } if(!geometry->is_orientation_preserving(determinant_floor)) { returnstd::unexpected(DeformationFailure{.reason=DeformationFailureReason::invalid_geometry,.message="Thegenerateddisplacementdoesnotremainstrictlyabovethedeterminantfloorateverysampledvolumepoint.",.element=geometry->minimum_element,.point=geometry->minimum_point}); } returnValidatedDisplacement{.displacement=std::move(*displacement),.geometry=*geometry}; } }//namespaceserif::geometry::deformation::backend::mfem