calibrated_mass.cpp serif/solver/preconditioner/strategies/surface/calibrated_mass.hpp cmath serif serif::solver serif::solver::preconditioner serif::solver::preconditioner::strategies serif::solver::preconditioner::strategies::surface #include"serif/solver/preconditioner/strategies/surface/calibrated_mass.hpp" #include<cmath> namespaceserif::solver::preconditioner::strategies::surface { std::expected<SurfaceMassFit,Failure>try_fit_surface_mass(doublenumerator,doubledenominator,CalibrationObjectiveobjective) { usingutils::errors::SERiFErrorCode; if(!std::isfinite(numerator)||!std::isfinite(denominator)||denominator<=0.0||numerator==0.0) { returnstd::unexpected(Failure{.code=SERiFErrorCode::PRECONDITIONER_INVALID_CALIBRATION,.message="Surfacemasscalibrationrequiresfinitenonzerocorrelationandpositiveprobeenergy.Choosearesolvednonzerophysicaltarget."}); } if(objective!=CalibrationObjective::operator_action&&objective!=CalibrationObjective::right_preconditioned_action) { returnstd::unexpected(Failure{.code=SERiFErrorCode::PRECONDITIONER_INVALID_OPTIONS,.message="Surfacemasscalibrationrequiresanoperator-actionorright-preconditioned-actionobjective."}); } constdoublemultiplier=numerator/denominator; constdoublescale=objective==CalibrationObjective::operator_action?multiplier:1.0/multiplier; constdoubleinverse_multiplier=1.0/scale; if(!std::isfinite(scale)||scale==0.0||!std::isfinite(inverse_multiplier)||inverse_multiplier==0.0) { returnstd::unexpected(Failure{.code=SERiFErrorCode::PRECONDITIONER_INVALID_CALIBRATION,.message="Thefittedsurfacemassscaleoritsinverseisnotfiniteandnonzero.Rescalethereferenceunitsorchooseanothertarget."}); } returnSurfaceMassFit{.numerator=numerator,.denominator=denominator,.scale=scale,.inverse_multiplier=inverse_multiplier}; } }//namespaceserif::solver::preconditioner::strategies::surface