#pragma once #include namespace fesa::elements { using Vector12 = std::array; using Matrix12 = std::array; using Vector3 = std::array; struct EulerBeam3DSection { double young_modulus; double shear_modulus; double area; double torsion_constant; double second_moment_y; double second_moment_z; }; struct EulerBeam3DGeometry { Vector3 node1; Vector3 node2; Vector3 orientation; }; Matrix12 euler_beam_3d_local_stiffness(double length, const EulerBeam3DSection& section); Vector12 euler_beam_3d_local_end_forces(double length, const EulerBeam3DSection& section, const Vector12& local_displacements); Matrix12 euler_beam_3d_global_stiffness(const EulerBeam3DGeometry& geometry, const EulerBeam3DSection& section); Vector12 euler_beam_3d_global_end_forces(const EulerBeam3DGeometry& geometry, const EulerBeam3DSection& section, const Vector12& global_displacements); } // namespace fesa::elements