linearization.hpp memory vector serif/geometry/deformation/actions.hpp src/compile_time_checks/serif/geometry/deformation.cpp src/include/serif/backend/mfem/model/deformation.hpp src/include/serif/geometry/deformation/computations.hpp serif::geometry::deformation::DeformationLinearization serif serif::geometry serif::geometry::deformation #pragmaonce #include<memory> #include<vector> #include"serif/geometry/deformation/actions.hpp" namespaceserif::geometry::deformation{ template<DeformationMapMap> structDeformationLinearization{ std::shared_ptr<constMap>map; std::vector<double>parameters; }; template<DeformationMapMap> [[nodiscard]]std::expected<std::vector<double>,DeformationFailure>evaluate_displacement(constMap&map,std::span<constdouble>parameters){ std::vector<double>result(map.output_size()); autoworkspace=make_deformation_workspace(map); if(constautostatus=build_displacement(map,parameters,result,workspace);!status){ returnstd::unexpected(status.error()); } returnresult; } template<DeformationMapMap> [[nodiscard]]DeformationStatusapply_jacobian(constDeformationLinearization<Map>&state,std::span<constdouble>direction,std::span<double>output,DeformationWorkspace<Map>&workspace){ if(!state.map){ returnstd::unexpected(DeformationFailure{.reason=DeformationFailureReason::invalid_configuration,.message="Adeformationlinearizationmustownavalidmathematicalmap."}); } returnapply_jacobian(*state.map,state.parameters,direction,output,workspace); } template<DeformationMapMap> [[nodiscard]]DeformationStatusapply_jacobian_transpose(constDeformationLinearization<Map>&state,std::span<constdouble>dual,std::span<double>output,DeformationWorkspace<Map>&workspace){ if(!state.map){ returnstd::unexpected(DeformationFailure{.reason=DeformationFailureReason::invalid_configuration,.message="Adeformationlinearizationmustownavalidmathematicalmap."}); } returnapply_jacobian_transpose(*state.map,state.parameters,dual,output,workspace); } template<DeformationMapMap> [[nodiscard]]DeformationStatusapply_pullback_derivative(constDeformationLinearization<Map>&state,std::span<constdouble>direction,std::span<constdouble>dual,std::span<double>output,DeformationWorkspace<Map>&workspace){ if(!state.map){ returnstd::unexpected(DeformationFailure{.reason=DeformationFailureReason::invalid_configuration,.message="Adeformationlinearizationmustownavalidmathematicalmap."}); } returnapply_pullback_derivative(*state.map,state.parameters,direction,dual,output,workspace); } }