computations.hpp span tuple serif/geometry/deformation/composition.hpp serif/geometry/deformation/linearization.hpp serif/utils/dependencies/computation_graph.hpp src/include/serif/backend/mfem/geometry/deformation/inputs.hpp src/include/serif/backend/mfem/model/computations/shape_derivatives.hpp src/include/serif/backend/mfem/model/computations/surface_potential.hpp src/include/serif/backend/mfem/model/volume_displacement.hpp src/include/serif/geometry/deformation/deformation.hpp src/include/serif/utils/serialize/numerics.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<span> #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,std::span<constdouble>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,std::span<constdouble>parameters,conststd::vector<double>&){ returnDeformationLinearization<DomainMap>{.map=map,.parameters={parameters.begin(),parameters.end()}}; }); 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