barycenter.hpp array cmath serif/discretization/blocks/fields.hpp serif/equations/contributions.hpp serif/equations/point.hpp serif/utils/error/errors.hpp src/compile_time_checks/serif/model/execution_validation.cpp src/include/serif/equations/equations.hpp serif::equations::BarycenterConstraint serif serif::equations #pragmaonce #include<array> #include<cmath> #include"serif/discretization/blocks/fields.hpp" #include"serif/equations/contributions.hpp" #include"serif/equations/point.hpp" #include"serif/utils/error/errors.hpp" namespaceserif::equations{ template<intAxis,typenameRow=discretization::blocks::frame_acceleration::component<Axis>> classBarycenterConstraintfinal:publicContribution<discretization::forms::Operand<Row>>{ public: static_assert(Axis>=0&&Axis<3,"AbarycenterconstraintrequiresaCartesianaxisfrom0through2."); usingDensity=discretization::blocks::density::mass; usingOperands=utils::types::TypeList<discretization::forms::Operand<Density>>; usingResidualQuantity=dimensions::Length; staticconstexprstd::string_viewname="barycenterconstraint"; explicitBarycenterConstraint(doubletarget_mass,std::array<double,3>center={}):m_target_mass(target_mass),m_center(center){ usingnamespaceutils::errors; serif_ensure<SERiFErrorCode::INVALID_ARGUMENT>(std::isfinite(target_mass)&&target_mass>0.0&& std::isfinite(center[0])&&std::isfinite(center[1])&&std::isfinite(center[2]), "Abarycenterconstraintrequiresafinitepositivetargetmassandafinitecenter."); } [[nodiscard]]PointLinearization<Operands>evaluate(constEquationPoint<Operands>&point)const{ constdoubleradius=(point.position[Axis]-m_center[Axis])/m_target_mass; PointLinearization<Operands>result; result.residual=point.fields.templateget<Density>()*radius; result.field_derivatives.templateget<Density>()=radius; result.position_derivative[Axis]=point.fields.templateget<Density>()/m_target_mass; returnresult; } [[nodiscard]]staticintadditional_order(discretization::forms::Operand<Density>,intposition_order){returnposition_order;} [[nodiscard]]doubletarget_mass()constnoexcept{returnm_target_mass;} [[nodiscard]]conststd::array<double,3>&center()constnoexcept{returnm_center;} private: doublem_target_mass; std::array<double,3>m_center; }; }