deformation.cpp concepts memory span type_traits utility serif/geometry/deformation/actions.hpp serif/geometry/deformation/backend/mfem/geometry_inspection.hpp serif/geometry/deformation/composition.hpp serif/geometry/deformation/linearization.hpp serif/geometry/deformation/radial_extension.hpp serif/geometry/deformation/surface_embedding.hpp #include<concepts> #include<memory> #include<span> #include<type_traits> #include<utility> #include"serif/geometry/deformation/actions.hpp" #include"serif/geometry/deformation/backend/mfem/geometry_inspection.hpp" #include"serif/geometry/deformation/composition.hpp" #include"serif/geometry/deformation/linearization.hpp" #include"serif/geometry/deformation/radial_extension.hpp" #include"serif/geometry/deformation/surface_embedding.hpp" namespace { namespacedeformation=serif::geometry::deformation; namespacespaces=deformation::spaces; structNonlinearSurface { usingInputSpace=spaces::ShapeParameters; usingOutputSpace=spaces::SurfaceDisplacement; structWorkspace { }; [[nodiscard]]std::size_tinput_size()const; [[nodiscard]]std::size_toutput_size()const; [[nodiscard]]Workspacemake_workspace()const; [[nodiscard]]deformation::DeformationStatusbuild_displacement(std::span<constdouble>,std::span<double>,Workspace&)const; [[nodiscard]]deformation::DeformationStatusapply_jacobian(std::span<constdouble>,std::span<constdouble>,std::span<double>,Workspace&)const; [[nodiscard]]deformation::DeformationStatusapply_jacobian_transpose(std::span<constdouble>,std::span<constdouble>,std::span<double>,Workspace&)const; [[nodiscard]]deformation::DeformationStatusapply_pullback_derivative(std::span<constdouble>,std::span<constdouble>,std::span<constdouble>,std::span<double>,Workspace&)const; }; structDeclaredLinearSurface:NonlinearSurface { staticconstexprboolis_linear=true; }; structIncompleteLinearSurface { usingInputSpace=spaces::ShapeParameters; usingOutputSpace=spaces::SurfaceDisplacement; usingWorkspace=deformation::EmptyDeformationWorkspace; staticconstexprboolis_linear=true; [[nodiscard]]std::size_tinput_size()const; [[nodiscard]]std::size_toutput_size()const; [[nodiscard]]deformation::DeformationStatusapply(std::span<constdouble>,std::span<double>,Workspace&)const; }; structMissingPullback:NonlinearSurface { deformation::DeformationStatusapply_pullback_derivative(std::span<constdouble>,std::span<constdouble>,std::span<constdouble>,std::span<double>,Workspace&)const=delete; }; structMissingTranspose:NonlinearSurface { deformation::DeformationStatusapply_jacobian_transpose(std::span<constdouble>,std::span<constdouble>,std::span<double>,Workspace&)const=delete; }; structWrongTrace:NonlinearSurface { usingOutputSpace=spaces::VolumeDisplacement; }; structMissingSemanticSpace:NonlinearSurface { private: usingOutputSpace=spaces::SurfaceDisplacement; }; template<typenameSurface,typenameExtension> conceptCanCompose=requires(std::shared_ptr<constSurface>surface,std::shared_ptr<constExtension>extension) { deformation::compose_deformation(surface,extension); }; static_assert(deformation::LinearDeformationMap<deformation::SurfaceEmbedding>); static_assert(deformation::LinearDeformationMap<deformation::RadialExtension>); static_assert(!std::default_initializable<deformation::SurfaceEmbedding>); static_assert(!std::default_initializable<deformation::RadialExtension>); static_assert(deformation::DeformationMap<NonlinearSurface>); static_assert(deformation::DifferentiableDeformationMap<NonlinearSurface>); static_assert(!deformation::LinearDeformationMap<NonlinearSurface>); static_assert(!deformation::is_linear_deformation<NonlinearSurface>); static_assert(!deformation::DeformationMap<MissingPullback>); static_assert(!deformation::DeformationMap<MissingTranspose>); static_assert(!deformation::DeformationMap<MissingSemanticSpace>); static_assert(!deformation::DeformationMap<int>); static_assert(!deformation::DeformationMap<IncompleteLinearSurface>); static_assert(!std::default_initializable<deformation::RadialInterpolation>); static_assert(!std::is_aggregate_v<deformation::RadialInterpolation>); static_assert(!std::constructible_from<deformation::RadialInterpolation,deformation::RadialInterpolationData>); static_assert(std::same_as<decltype(std::declval<deformation::RadialInterpolation&>().data()),constdeformation::RadialInterpolationData&>); static_assert(CanCompose<deformation::SurfaceEmbedding, deformation::RadialExtension>); static_assert(CanCompose<NonlinearSurface, deformation::RadialExtension>); static_assert(!CanCompose<WrongTrace, deformation::RadialExtension>); static_assert(!CanCompose<deformation::RadialExtension, deformation::SurfaceEmbedding>); usingLinearDomain=deformation::ComposedDeformation<deformation::SurfaceEmbedding,deformation::RadialExtension>; usingNonlinearDomain=deformation::ComposedDeformation<NonlinearSurface,deformation::RadialExtension>; usingDeclaredLinearDomain=deformation::ComposedDeformation<DeclaredLinearSurface,deformation::RadialExtension>; static_assert(deformation::LinearDeformationMap<LinearDomain>); static_assert(!deformation::DifferentiableDeformationMap<LinearDomain>); static_assert(std::same_as<decltype(LinearDomain::Workspace::curvature),deformation::EmptyDeformationWorkspace>); static_assert(deformation::DeformationMap<DeclaredLinearDomain>); static_assert(deformation::is_linear_deformation<DeclaredLinearDomain>); static_assert(!deformation::LinearDeformationMap<DeclaredLinearDomain>); static_assert(!std::default_initializable<LinearDomain>); static_assert(deformation::DeformationMap<NonlinearDomain>); static_assert(deformation::is_linear_deformation<LinearDomain>); static_assert(!deformation::is_linear_deformation<NonlinearDomain>); static_assert(std::same_as<LinearDomain::InputSpace,spaces::ShapeParameters>); static_assert(std::same_as<LinearDomain::OutputSpace,spaces::VolumeDisplacement>); static_assert(std::same_as<deformation::DeformationWorkspace<deformation::SurfaceEmbedding>,deformation::EmptyDeformationWorkspace>); static_assert(std::same_as<deformation::DeformationWorkspace<NonlinearSurface>,NonlinearSurface::Workspace>); static_assert(std::same_as<deformation::DeformationWorkspace<LinearDomain>,LinearDomain::Workspace>); template<typenameMap> conceptCanBuildValidatedDisplacement=requires(constMap&map,std::span<constdouble>parameters,const::mfem::FiniteElementSpace&space) { deformation::backend::mfem::build_validated_displacement(map,parameters,space); }; static_assert(CanBuildValidatedDisplacement<LinearDomain>); static_assert(CanBuildValidatedDisplacement<NonlinearDomain>); static_assert(!CanBuildValidatedDisplacement<deformation::SurfaceEmbedding>); }//namespace