radial.hpp array expected functional string mfem/fem/gridfunc.hpp serif/utils/projection/radial.hpp src/compile_time_checks/serif/utils/projection.cpp src/include/serif/utils/projection/projection.hpp src/lib/serif/utils/projection/radial.cpp serif::utils::projection::backend::mfem::RadialProjectionOptions serif serif::mapping serif::utils serif::utils::projection serif::utils::projection::backend serif::utils::projection::backend::mfem serif::utils::projection::backend::mfem::detail #pragmaonce #include<array> #include<expected> #include<functional> #include<string> #include"mfem/fem/gridfunc.hpp" #include"serif/utils/projection/radial.hpp" namespaceserif::mapping{ classGridFunctionMappingEvaluator; } namespaceserif::utils::projection::backend::mfem{ structRadialProjectionOptions{ std::array<double,3>center{}; mapping::GridFunctionMappingEvaluator*mapping{nullptr}; //Infinitycallbacksreturnlimitingvaluesalreadypulledbacktomeshcoordinates. std::function<RadialValue(const::mfem::Vector&)>scalar_at_infinity{}; std::function<std::expected<::mfem::Vector,std::string>(const::mfem::Vector&)>vector_at_infinity{}; }; usingProjectionResult=std::expected<::mfem::GridFunction,std::string>; namespacedetail{ [[nodiscard]]ProjectionResultproject_scalar( ::mfem::FiniteElementSpace&space, conststd::function<RadialValue(double)>&profile, constRadialProjectionOptions&options ); [[nodiscard]]ProjectionResultproject_vector( ::mfem::FiniteElementSpace&space, conststd::function<RadialValue(double)>&radial_amplitude, constRadialProjectionOptions&options ); } template<RadialFunctionFunction> [[nodiscard]]ProjectionResultproject_scalar( ::mfem::FiniteElementSpace&space, constFunction&profile, constRadialProjectionOptions&options={} ){ returndetail::project_scalar(space,projection::detail::checked_profile(profile),options); } template<RadialFunctionFunction> [[nodiscard]]ProjectionResultproject_vector( ::mfem::FiniteElementSpace&space, constFunction&radial_amplitude, constRadialProjectionOptions&options={} ){ returndetail::project_vector(space,projection::detail::checked_profile(radial_amplitude),options); } }