reference_mass.cpp serif/solver/preconditioner/backend/mfem/surface/reference_mass.hpp vector serif/solver/preconditioner/backend/mfem/inverse/diagonal.hpp serif/solver/preconditioner/backend/mfem/inverse/regularization.hpp serif/solver/preconditioner/backend/mfem/surface/detail/calibration.hpp serif serif::solver serif::solver::preconditioner serif::solver::preconditioner::backend serif::solver::preconditioner::backend::mfem #include"serif/solver/preconditioner/backend/mfem/surface/reference_mass.hpp" #include<vector> #include"serif/solver/preconditioner/backend/mfem/inverse/diagonal.hpp" #include"serif/solver/preconditioner/backend/mfem/inverse/regularization.hpp" #include"serif/solver/preconditioner/backend/mfem/surface/detail/calibration.hpp" namespaceserif::solver::preconditioner::backend::mfem { std::expected<SurfaceMassInverse,Failure>detail::surface_mass_inverse(std::span<constdouble>metric,strategies::surface::SurfaceMassFitfit,strategies::inverse::DiagonalRegularizationregularization) { std::vector<double>scaled(metric.size()); for(std::size_tindex=0;index<metric.size();++index) { scaled[index]=metric[index]*fit.scale; } constautodiagonal=try_regularize_diagonal(scaled,regularization); if(!diagonal) { returnstd::unexpected(diagonal.error()); } constautoinverse=try_diagonal_inverse(diagonal->values); if(!inverse) { returnstd::unexpected(inverse.error()); } returnSurfaceMassInverse{.inverse=*inverse,.fit=fit,.regularization=diagonal->report}; } std::expected<SurfaceMassInverse,Failure>try_reference_surface_mass_inverse(std::span<constdouble>reference_metric,strategies::surface::ReferenceSurfaceMassoptions) { if(constautovalid=detail::validate_surface_metric(reference_metric);!valid) { returnstd::unexpected(valid.error()); } returndetail::surface_mass_inverse(reference_metric,{},options.regularization); } }//namespaceserif::solver::preconditioner::backend::mfem