action_storage.hpp algorithm cmath functional initializer_list span serif/geometry/deformation/failure.hpp src/include/serif/backend/mfem/geometry/deformation/constrained_radial_extension.hpp src/include/serif/geometry/deformation/actions.hpp src/lib/serif/geometry/deformation/radial_extension.cpp src/lib/serif/geometry/deformation/surface_embedding.cpp serif::geometry::deformation::detail::ActionInput serif serif::geometry serif::geometry::deformation serif::geometry::deformation::detail #pragmaonce #include<algorithm> #include<cmath> #include<functional> #include<initializer_list> #include<span> #include"serif/geometry/deformation/failure.hpp" namespaceserif::geometry::deformation { [[nodiscard]]inlineDeformationStatusvalidate_deformation_values(std::span<constdouble>values,std::size_texpected_size) { if(values.size()!=expected_size) { returnstd::unexpected(DeformationFailure{.reason=DeformationFailureReason::invalid_size,.message="Deformationvectorsizedoesnotmatchitsmap."}); } if(!std::ranges::all_of(values,[](doublevalue) { returnstd::isfinite(value); })) { returnstd::unexpected(DeformationFailure{.reason=DeformationFailureReason::non_finite,.message="Deformationcoefficients,directions,forcesandactionresultsmustbefinite."}); } return{}; } }//namespaceserif::geometry::deformation namespaceserif::geometry::deformation::detail { [[nodiscard]]inlineDeformationStatusvalidate_disjoint_output(std::span<double>output,std::initializer_list<std::span<constdouble>>inputs) { if(output.empty()) { return{}; } conststd::less<constdouble*>before; constdouble*output_end=output.data()+output.size(); for(conststd::span<constdouble>input:inputs) { if(input.empty()) { continue; } if(before(input.data(),output_end)&&before(output.data(),input.data()+input.size())) { returnstd::unexpected(DeformationFailure{.reason=DeformationFailureReason::invalid_configuration,.message="Deformationactionoutputmustnotoverlapitsparameters,directions,orforces."}); } } return{}; } structActionInput { std::span<constdouble>values; std::size_tsize; }; [[nodiscard]]inlineDeformationStatusvalidate_action_arguments(std::span<double>output,std::size_toutput_size,std::initializer_list<ActionInput>inputs) { if(output.size()!=output_size) { returnstd::unexpected(DeformationFailure{.reason=DeformationFailureReason::invalid_size,.message="Deformationoutputsizedoesnotmatchitsmap."}); } for(constActionInputinput:inputs) { if(constDeformationStatusstatus=validate_disjoint_output(output,{input.values});!status) { returnstatus; } if(constDeformationStatusstatus=validate_deformation_values(input.values,input.size);!status) { returnstatus; } } return{}; } }//namespaceserif::geometry::deformation::detail