#pragma once #include "fesa/core/status.h" #include "fesa/math/matrix.h" #include "fesa/math/vector.h" #include "fesa/model/model_types.hpp" #include #include #include #include namespace fesa { struct ConstantLocalLineLoad { double px; double py; double pz; double mx; }; struct BeamStressPoint { int gaussPoint; std::size_t sectionPoint; double x1; double x2; double s11; std::string source; }; struct BeamRecovery { std::array, 2> equilibriumEndActions; std::array, 2> endpointSectionResultants; std::array, 2> gaussGeneralizedStrains; std::array, 2> gaussGeneralizedResultants; std::vector stressPoints; }; // Implements the approved two-node straight prismatic B33 Euler-Bernoulli // kernel. Equation numbering and element identity remain outside this type. class EulerBeam3D { public: static Result create(const Node& firstNode, const Node& secondNode, const GeneralBeamSection& section, const LinearElasticMaterial& material); Matrix localStiffness() const; Matrix globalStiffness() const; Vector localEquivalentLoad(const ConstantLocalLineLoad& load) const; BeamRecovery recover(const Vector& globalElementDisplacement) const; private: EulerBeam3D(double length, double youngsModulus, double shearModulus, double area, double iy, double iz, double torsionalConstant, std::array rotation, std::vector> sectionPoints); double length_; double youngsModulus_; double shearModulus_; double area_; double iy_; double iz_; double torsionalConstant_; std::array rotation_; std::vector> sectionPoints_; }; } // namespace fesa