87 lines
3.3 KiB
C++
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_
|