#ifndef BEAM_HPP #define BEAM_HPP #include #include #include #include struct RectangularBeamDimensions { float b; float h; RectangularBeamDimensions(const float &width, const float &height) : b(width), h(height) { assert(width > 0 && height > 0); } RectangularBeamDimensions() : b(0.01), h(0.01) {} }; struct CylindricalElementDimensions { float od; // Cylinder outside diameter float id; // Cylinder inside diameter // https://www.engineeringtoolbox.com/area-moment-inertia-d_1328.html CylindricalElementDimensions(const float &outsideDiameter, const float &insideDiameter) : od(outsideDiameter), id(insideDiameter) { assert(outsideDiameter > 0 && insideDiameter > 0 && outsideDiameter > insideDiameter); } CylindricalElementDimensions() : od(0.03), id(0.026) {} }; struct ElementMaterial { float poissonsRatio; float youngsModulusGPascal; ElementMaterial(const float &poissonsRatio, const float &youngsModulusGPascal) : poissonsRatio(poissonsRatio), youngsModulusGPascal(youngsModulusGPascal) { assert(poissonsRatio <= 0.5 && poissonsRatio >= -1); } ElementMaterial() : poissonsRatio(0.3), youngsModulusGPascal(7.5) {} }; struct BeamProperties { float crossArea; float I2; float I3; float polarInertia; BeamProperties(const RectangularBeamDimensions &dimensions, const ElementMaterial &material) { crossArea = (dimensions.b * dimensions.h); I2 = dimensions.b * std::pow(dimensions.h, 3) / 12; I3 = dimensions.h * std::pow(dimensions.b, 3) / 12; polarInertia = (I2 + I3); } }; #endif // BEAM_HPP