computations.hpp tuple serif/geometry/deformation/composition.hpp serif/geometry/deformation/linearization.hpp serif/utils/dependencies/computation_graph.hpp src/include/serif/geometry/deformation/backend/mfem/inputs.hpp src/include/serif/geometry/deformation/backend/mfem/volume_displacement.hpp src/include/serif/geometry/deformation/deformation.hpp serif::geometry::deformation::keys::ReferenceDiscretization serif::geometry::deformation::keys::SurfaceDiscretization serif::geometry::deformation::keys::ReferenceCoordinates serif::geometry::deformation::keys::SurfaceNodes serif::geometry::deformation::keys::SurfaceModel serif::geometry::deformation::keys::InteriorModel serif::geometry::deformation::keys::VacuumModel serif::geometry::deformation::keys::ShapeCoefficients serif::geometry::deformation::keys::ReferenceSurface serif::geometry::deformation::keys::RadialInterpolation serif::geometry::deformation::keys::SurfaceMap serif::geometry::deformation::keys::VolumeExtension serif::geometry::deformation::keys::DomainMap serif::geometry::deformation::keys::SurfaceDisplacement serif::geometry::deformation::keys::VolumeDisplacement serif::geometry::deformation::keys::Linearization serif::geometry::deformation::keys::SurfaceMetric serif serif::geometry serif::geometry::deformation serif::geometry::deformation::keys #pragmaonce #include<tuple> #include"serif/geometry/deformation/composition.hpp" #include"serif/geometry/deformation/linearization.hpp" #include"serif/utils/dependencies/computation_graph.hpp" namespaceserif::geometry::deformation { namespacekeys { structReferenceDiscretization { }; structSurfaceDiscretization { }; structReferenceCoordinates { }; structSurfaceNodes { }; structSurfaceModel { }; structInteriorModel { }; structVacuumModel { }; structShapeCoefficients { }; structReferenceSurface { }; structRadialInterpolation { }; structSurfaceMap { }; structVolumeExtension { }; structDomainMap { }; structSurfaceDisplacement { }; structVolumeDisplacement { }; structLinearization { }; structSurfaceMetric { }; }//namespacekeys template<DeformationMapSurfaceMap,DeformationMapExtensionMap> requiresstd::same_as<typenameSurfaceMap::OutputSpace,typenameExtensionMap::InputSpace> [[nodiscard]]automake_deformation_computations() { usingnamespaceutils::dependencies; usingDomainMap=ComposedDeformation<SurfaceMap, ExtensionMap>; constautodomain_map=make_computation<keys::DomainMap,InputList<keys::SurfaceMap,keys::VolumeExtension>>( [](conststd::shared_ptr<constSurfaceMap>&surface,conststd::shared_ptr<constExtensionMap>&extension)->std::expected<std::shared_ptr<constDomainMap>,DeformationFailure> { autoresult=compose_deformation(surface,extension); if(!result) { returnstd::unexpected(result.error()); } returnstd::make_shared<constDomainMap>(std::move(*result)); }); constautosurface_displacement=make_computation<keys::SurfaceDisplacement,InputList<keys::SurfaceMap,keys::ShapeCoefficients>>( [](conststd::shared_ptr<constSurfaceMap>&surface,conststd::vector<double>&parameters)->std::expected<std::vector<double>,DeformationFailure> { if(!surface) { returnstd::unexpected(DeformationFailure{.reason=DeformationFailureReason::invalid_configuration,.message="Shapeevaluationrequiresanownedsurfacemap."}); } returnevaluate_displacement(*surface,parameters); }); constautovolume_displacement=make_computation<keys::VolumeDisplacement,InputList<keys::VolumeExtension,keys::SurfaceDisplacement>>( [](conststd::shared_ptr<constExtensionMap>&extension,conststd::vector<double>&surface)->std::expected<std::vector<double>,DeformationFailure> { if(!extension) { returnstd::unexpected(DeformationFailure{.reason=DeformationFailureReason::invalid_configuration,.message="Volumedeformationrequiresanownedextensionmap."}); } returnevaluate_displacement(*extension,surface); }); constautolinearization=make_computation<keys::Linearization,InputList<keys::DomainMap,keys::ShapeCoefficients,keys::VolumeDisplacement>>( [](conststd::shared_ptr<constDomainMap>&map,conststd::vector<double>&parameters,conststd::vector<double>&) { returnDeformationLinearization<DomainMap>{.map=map,.parameters=parameters}; }); returnstd::tuple{domain_map,surface_displacement,volume_displacement,linearization}; } template<DeformationMapSurfaceMap,DeformationMapExtensionMap> requiresstd::same_as<typenameSurfaceMap::OutputSpace,typenameExtensionMap::InputSpace> [[nodiscard]]automake_deformation_graph() { returnstd::apply([](auto...computations) { returnutils::dependencies::make_computation_graph(std::move(computations)...); }, make_deformation_computations<SurfaceMap, ExtensionMap>()); } }//namespaceserif::geometry::deformation