Add immutable MITC4 drilling selection and direct director springs

This commit is contained in:
KOKO\Mimi
2026-10-20 08:52:43 +09:00
parent 52e321e15c
commit 8bac3ebf49
9 changed files with 670 additions and 22 deletions
@@ -0,0 +1,26 @@
#ifndef FESA_ELEMENTS_MITC4_DRILLING_MODE_H_
#define FESA_ELEMENTS_MITC4_DRILLING_MODE_H_
namespace fesa {
/// @brief Identifies the immutable numerical MITC4 drilling formulation.
enum class Mitc4DrillingMode { kDirectSpring, kLegacyCorotatedTwist };
/// @brief Returns the stable storage name of a supported drilling formulation.
constexpr const char* Mitc4DrillingModeName(Mitc4DrillingMode mode) noexcept {
switch (mode) {
case Mitc4DrillingMode::kDirectSpring:
return "direct-initial-director-spring";
case Mitc4DrillingMode::kLegacyCorotatedTwist:
return "legacy-corotated-twist";
}
return "";
}
namespace mitc4_drilling_internal {
struct TestAccess;
} // namespace mitc4_drilling_internal
} // namespace fesa
#endif // FESA_ELEMENTS_MITC4_DRILLING_MODE_H_
+8
View File
@@ -8,6 +8,7 @@
#include "fesa/core/status.h"
#include "fesa/elements/element.h"
#include "fesa/elements/mitc4_shell_definition.h"
#include "fesa/elements/mitc4_drilling_mode.h"
#include "fesa/materials/isotropic_linear_elastic_material.h"
#include "fesa/math/matrix.h"
#include "fesa/math/vector.h"
@@ -92,6 +93,11 @@ class Mitc4Shell final : public Element {
std::array<std::array<double, 3>, 4> initial_directors,
const ShellSection& section, const LinearElasticMaterial& material);
/// @brief Returns this immutable kernel's production drilling formulation.
[[nodiscard]] Mitc4DrillingMode DrillingMode() const noexcept {
return drilling_mode_;
}
/// @brief Returns the factory-bound MITC4 DOF order.
const ElementDofLayout& DofLayout() const noexcept override;
@@ -163,6 +169,7 @@ class Mitc4Shell final : public Element {
private:
friend class ElementFactory;
friend struct mitc4_drilling_internal::TestAccess;
/// @brief Binds Domain identity after the numerical candidate is valid.
void BindRuntime(ElementDofLayout layout, EntityIndex element_index,
@@ -203,6 +210,7 @@ class Mitc4Shell final : public Element {
double thickness_;
double youngs_modulus_;
double poisson_ratio_;
Mitc4DrillingMode drilling_mode_;
SourceLocation source_location_;
std::string identity_;
ElementDofLayout dof_layout_;
@@ -54,6 +54,8 @@ struct NonlinearMitc4InternalEquilibrium {
Matrix drilling_metric{0U, 0U};
double drilling_energy = 0.0;
Vector force_directional_second{0U};
/// @brief Stores D2(f_drill)[v,v] separately; direct springs give exact zero.
Vector drilling_force_directional_second{0U};
Vector drilling_constraint{0U};
Matrix drilling_constraint_gradient{0U, 0U};
std::array<Matrix, 4> drilling_constraint_hessian{
@@ -104,6 +106,11 @@ class NonlinearMitc4Shell {
std::array<ShellNodeInitialFrame, 4> initial_frames,
const ShellSection& section, const LinearElasticMaterial& material);
/// @brief Returns this immutable kernel's numerical drilling formulation.
[[nodiscard]] Mitc4DrillingMode DrillingMode() const noexcept {
return drilling_mode_;
}
/// @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.
@@ -134,6 +141,7 @@ class NonlinearMitc4Shell {
private:
friend struct nonlinear_mitc4_internal::ConfigurationSnapshot;
friend struct mitc4_drilling_internal::TestAccess;
/// @brief Retains validated fixed-reference data without analysis ownership.
NonlinearMitc4Shell(std::array<Vector3, 4> coordinates,
@@ -155,6 +163,7 @@ class NonlinearMitc4Shell {
double youngs_modulus_;
double poisson_ratio_;
double drilling_stiffness_;
Mitc4DrillingMode drilling_mode_;
SourceLocation source_location_;
std::string identity_;
};