signed_inverse.cpp serif/solver/preconditioner/backend/mfem/surface/fitted_h1.hpp utility serif/solver/preconditioner/backend/mfem/inverse/validation.hpp serif serif::solver serif::solver::preconditioner serif::solver::preconditioner::backend serif::solver::preconditioner::backend::mfem #include"serif/solver/preconditioner/backend/mfem/surface/fitted_h1.hpp" #include<utility> #include"serif/solver/preconditioner/backend/mfem/inverse/validation.hpp" namespaceserif::solver::preconditioner::backend::mfem { namespace { classSignedSurfaceInversefinal:public::mfem::Operator { public: SignedSurfaceInverse(OperatorHandlepositive,doublesign) :::mfem::Operator(positive->Height(),positive->Width()),m_positive(std::move(positive)),m_sign(sign),m_correction(Height()) { } voidMult(const::mfem::Vector&input,::mfem::Vector&output)constoverride { detail::require_application_size(*this,input,output); m_correction=0.0; m_positive->Mult(input,m_correction); output=m_correction; output*=m_sign; } private: OperatorHandlem_positive; doublem_sign; mutable::mfem::Vectorm_correction; }; }//namespace std::expected<Inverse,Failure>try_signed_surface_inverse(Inversepositive_inverse,doublesign) { usingutils::errors::SERiFErrorCode; if(sign!=1.0&&sign!=-1.0) { returnstd::unexpected(Failure{.code=SERiFErrorCode::PRECONDITIONER_INVALID_OPTIONS,.message="Thefittedsurfacesignmustbe+1or-1.Keeppositivemassandstiffnesscoefficientsinsidethebackend."}); } if(constautovalid=detail::check_square(positive_inverse.action.get());!valid) { returnstd::unexpected(valid.error()); } returnInverse{.action=std::make_shared<SignedSurfaceInverse>(std::move(positive_inverse.action),sign),.contract=positive_inverse.contract}; } }//namespaceserif::solver::preconditioner::backend::mfem