scales.cpp serif/solver/normalization/scales.hpp cmath serif/utils/error/errors.hpp serif serif::solver serif::solver::normalization #include"serif/solver/normalization/scales.hpp" #include<cmath> #include"serif/utils/error/errors.hpp" namespaceserif::solver::normalization { std::expected<StellarReferenceScales,std::string>prepare_stellar_reference_scales( dimensions::QuantityValue<dimensions::Mass>mass, dimensions::QuantityValue<dimensions::Length>radius, dimensions::QuantityValue<dimensions::GravitationalConstant>gravitational_constant) { usingnamespaceutils::errors; for(constdoublevalue:{mass.value(),radius.value(),gravitational_constant.value()}) { if(!std::isfinite(value)||value<=0.0) { returnstd::unexpected(format_error_message<SERiFErrorCode::NORMALIZATION_ERROR>("Stellarnormalizationrequiresfinite,positivereferencemass,radius,andgravitationalconstant.Correctthereferencevalues.")); } } constdoublereference_mass=mass.value(); constdoublereference_radius=radius.value(); constdoublegravity=gravitational_constant.value(); constdoubleradius_squared=reference_radius*reference_radius; constdoubleradius_cubed=radius_squared*reference_radius; constdoubledensity=reference_mass/radius_cubed; constdoubleacceleration=gravity*reference_mass/radius_squared; constdoubleinverse_time_squared=gravity*reference_mass/radius_cubed; constdoublespecific_energy=gravity*reference_mass/reference_radius; constdoublepressure=density*specific_energy; constdoubleangular_velocity=std::sqrt(inverse_time_squared); constdoubleangular_momentum=reference_mass*std::sqrt(gravity*reference_mass*reference_radius); constdoubleforce=reference_mass*acceleration; for(constdoublevalue:{density,acceleration,inverse_time_squared,specific_energy,pressure,angular_velocity,angular_momentum,force}) { if(!std::isfinite(value)||value<=0.0) { returnstd::unexpected(format_error_message<SERiFErrorCode::NORMALIZATION_ERROR>("Acharacteristicstellarnormalizationscaleisnotfiniteandpositive;choosereferenceunitsinwhicheveryderivedscaleisrepresentable.")); } } returnStellarReferenceScales{ .mass=mass, .radius=radius, .gravitational_constant=gravitational_constant, .density=dimensions::QuantityValue<dimensions::MassDensity>{density}, .acceleration=dimensions::QuantityValue<dimensions::Acceleration>{acceleration}, .inverse_time_squared=dimensions::QuantityValue<dimensions::InverseTimeSquared>{inverse_time_squared}, .specific_energy=dimensions::QuantityValue<dimensions::SpecificEnergy>{specific_energy}, .pressure=dimensions::QuantityValue<dimensions::Pressure>{pressure}, .angular_velocity=dimensions::QuantityValue<dimensions::AngularVelocity>{angular_velocity}, .angular_momentum=dimensions::QuantityValue<dimensions::AngularMomentum>{angular_momentum}, .force=dimensions::QuantityValue<dimensions::Force>{force} }; } }