#pragma once #include "fesa/core/status.hpp" #include "fesa/math/matrix.hpp" #include "fesa/model/model_types.hpp" #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; }; // Concrete small-rotation MITC4 kinematics and material value kernel. Global // equation ownership, drilling stiffness, recovery, and assembly remain 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; 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); 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_; }; } // namespace fesa