#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 namespace fesa { struct Mitc4ShapeFunctions { std::array values; std::array xiDerivatives; std::array etaDerivatives; }; struct Mitc4LocalFrame { std::array e1; std::array e2; std::array e3; }; struct Mitc4TyingWeights { std::array xiZeta; std::array etaZeta; }; struct Mitc4QuadraturePoint { std::array naturalCoordinates; double weight; }; struct Mitc4Stiffness { Matrix physicalLocal20; Matrix physicalGlobal24; Matrix drillingGlobal24; Matrix stabilizedGlobal24; double drillingStiffness; }; struct Mitc4PhysicalRecoveryPoint { std::array naturalCoordinates; Mitc4LocalFrame localFrame; std::array generalizedStrain; std::array sectionResultant; std::array, 3> inPlaneStress; }; struct Mitc4PhysicalRecovery { std::array points; double strainEnergy; }; // Concrete small-rotation MITC4 kinematics, constitutive, stiffness, and // physical-only recovery kernel. Global equation/result ownership remains outside. class Mitc4Shell { public: static Result create( std::array nodes, std::array, 4> initialDirectors, const ShellSection& section, const LinearElasticMaterial& material); static Mitc4ShapeFunctions shapeFunctions(double xi, double eta) noexcept; static Mitc4TyingWeights tyingWeights(double xi, double eta) noexcept; static const std::array& volumeQuadrature() noexcept; [[nodiscard]] Mitc4LocalFrame localFrame(double xi, double eta) const; [[nodiscard]] Matrix physicalTransformation20() const; [[nodiscard]] Matrix drillingTransformation4() const; [[nodiscard]] Matrix directStrainDisplacement20( double xi, double eta, double zeta) const; [[nodiscard]] Matrix covariantTyingShearSamples20() const; [[nodiscard]] Matrix strainDisplacement20( double xi, double eta, double zeta) const; [[nodiscard]] Matrix planeStressConstitutive() const; [[nodiscard]] Matrix materialConstitutive5() const; [[nodiscard]] Matrix membraneSectionMatrix() const; [[nodiscard]] Matrix bendingSectionMatrix() const; [[nodiscard]] Matrix transverseShearSectionMatrix() const; [[nodiscard]] Result stiffness() const; [[nodiscard]] Result recoverPhysical( const Vector& globalElementDisplacement24) const; private: using Vector3 = std::array; struct GeometryData { std::array covariant; std::array reciprocal; Mitc4LocalFrame frame; double jacobian; }; Mitc4Shell( std::array coordinates, std::array directors, std::array tangentA, std::array tangentB, Vector3 normalCandidate, double thickness, double youngsModulus, double poissonRatio, SourceLocation sourceLocation, std::string identity); bool evaluateGeometry( double xi, double eta, double zeta, GeometryData& result) const noexcept; std::array, 20> basisDerivatives( double xi, double eta, double zeta) const noexcept; Matrix strainDisplacement( double xi, double eta, double zeta, const Matrix* tyingSamples) const; std::array coordinates_; std::array directors_; std::array tangentA_; std::array tangentB_; Vector3 normalCandidate_; double thickness_; double youngsModulus_; double poissonRatio_; SourceLocation sourceLocation_; std::string identity_; }; } // namespace fesa