Files
FESADev/include/fesa/elements/nonlinear_mitc4_shell.h
T

87 lines
3.3 KiB
C++

#ifndef FESA_ELEMENTS_NONLINEAR_MITC4_SHELL_H_
#define FESA_ELEMENTS_NONLINEAR_MITC4_SHELL_H_
#include <array>
#include <string>
#include "fesa/core/status.h"
#include "fesa/elements/mitc4_shell.h"
#include "fesa/math/matrix.h"
#include "fesa/math/vector3.h"
#include "fesa/model/model_types.h"
#include "fesa/results/result_records.h"
namespace fesa {
/// @brief Stores one four-node nonlinear shell trial in global coordinates.
struct NonlinearMitc4TrialDofs {
std::array<Vector3, 4> displacement;
std::array<Vector3, 4> rotation_vector;
};
/// @brief Stores physical shell recovery at one midsurface Gauss location.
struct NonlinearMitc4RecoveryPoint {
ShellMidsurfaceLocation location;
std::array<double, 2> natural_coordinates;
Mitc4LocalFrame local_frame;
std::array<double, 8> generalized_strain;
std::array<double, 8> section_resultant;
std::array<ShellSectionStressRow, 3> stress;
};
/// @brief Stores the fixed four-row nonlinear physical recovery inventory.
struct NonlinearMitc4Recovery {
std::array<NonlinearMitc4RecoveryPoint, 4> gauss_points;
double physical_strain_energy;
};
/// @brief Evaluates fixed-reference Total Lagrangian MITC4 kinematics.
/// @note This class owns no mutable trial or accepted analysis state.
class NonlinearMitc4Shell {
public:
/// @brief Creates one checked nonlinear MITC4 element kinematics object.
/// @param nodes Four non-owning source nodes in natural source order.
/// @param initial_frames Matching fixed initial node frames in source order.
/// @param section Centered positive-thickness shell section.
/// @param material Homogeneous isotropic material with shell-valid constants.
/// @return A checked evaluator or a structured model failure.
static Result<NonlinearMitc4Shell> Create(
std::array<const Node*, 4> nodes,
std::array<ShellNodeInitialFrame, 4> initial_frames,
const ShellSection& section, const LinearElasticMaterial& material);
/// @brief Evaluates trial physical kinematics and fixed recovery rows.
/// @param trial Global nodal translation and fixed-global rotation vectors.
/// @return Physical recovery or a fail-closed trial diagnostic.
[[nodiscard]] Result<NonlinearMitc4Recovery> EvaluateKinematics(
const NonlinearMitc4TrialDofs& trial) const;
/// @brief Recovers the same physical quantities for one complete trial.
/// @param trial Global nodal translation and fixed-global rotation vectors.
/// @return Four ordered Gauss rows without nodal stress projection.
[[nodiscard]] Result<NonlinearMitc4Recovery> RecoverState(
const NonlinearMitc4TrialDofs& trial) const;
private:
/// @brief Retains validated fixed-reference data without analysis ownership.
NonlinearMitc4Shell(std::array<Vector3, 4> coordinates,
std::array<Matrix, 4> initial_frames,
std::array<Vector3, 4> initial_directors,
double thickness, double youngs_modulus,
double poisson_ratio, SourceLocation source_location,
std::string identity);
std::array<Vector3, 4> coordinates_;
std::array<Matrix, 4> initial_frames_;
std::array<Vector3, 4> initial_directors_;
double thickness_;
double youngs_modulus_;
double poisson_ratio_;
SourceLocation source_location_;
std::string identity_;
};
} // namespace fesa
#endif // FESA_ELEMENTS_NONLINEAR_MITC4_SHELL_H_