specifications.cpp algorithm cmath stdexcept serif/model/specifications/fixed_angular_momentum.hpp serif/model/specifications/fixed_total_mass.hpp serif/utils/error/errors.hpp serif serif::model #include<algorithm> #include<cmath> #include<stdexcept> #include"serif/model/specifications/fixed_angular_momentum.hpp" #include"serif/model/specifications/fixed_total_mass.hpp" #include"serif/utils/error/errors.hpp" namespaceserif::model { staticvoidvalidate_target(doublevalue,boolzero_allowed,std::string_viewname) { usingnamespaceutils::errors; serif_ensure<SERiFErrorCode::INVALID_ARGUMENT,std::invalid_argument>(std::isfinite(value)&&(zero_allowed?value>=0.0:value>0.0), "The{}targetmustbefiniteand{};received{}.Supplyaphysicaltargetinthepermittedrange.",name,zero_allowed?"nonnegative":"positive",value); } FixedTotalMass::FixedTotalMass(TargetValuemass):m_target(mass) { validate_target(mass.value(),false,"totalmass"); } FixedTotalMass::FixedTotalMass(Parametersparameters):FixedTotalMass(parameters.total_mass) { } FixedAngularMomentum::FixedAngularMomentum(TargetValueangular_momentum):FixedAngularMomentum(Parameters{.angular_momentum=angular_momentum}) { } FixedAngularMomentum::FixedAngularMomentum(Parametersparameters):m_target(parameters.angular_momentum),m_axis(parameters.axis),m_center(parameters.center) { usingnamespaceutils::errors; validate_target(m_target.value(),true,"angularmomentum"); doublemaximum_component=0.0; for(std::size_tcomponent=0;component<m_axis.size();++component) { serif_ensure<SERiFErrorCode::INVALID_ARGUMENT,std::invalid_argument>(std::isfinite(m_axis[component])&&std::isfinite(m_center[component]), "Rotationaxisandcentercomponentsmustbefinite;component{}containsaxis{}andcenter{}.Supplyafiniterotationaxisandcenter.",component,m_axis[component],m_center[component]); maximum_component=std::max(maximum_component,std::abs(m_axis[component])); } serif_ensure<SERiFErrorCode::INVALID_ARGUMENT,std::invalid_argument>(maximum_component>0.0,"Arotationaxismustbenonzero;supplyadirectionsuchas(0,0,1)."); for(double&component:m_axis) { component/=maximum_component; } constdoublenorm=std::hypot(m_axis[0],m_axis[1],m_axis[2]); for(double&component:m_axis) { component/=norm; } } }//namespaceserif::model