feat: add eigen2 frequency pipeline and fail-closed validation
Implement MITC4 mass, constrained whitening, MKL FEAST, modal HDF5, and deterministic Value comparison. MSVC Debug builds; 394 of 395 tests pass. Original-model all-c residual and the documented S3 static contract conflict remain unresolved; this is an implementation checkpoint, not feature acceptance.
This commit is contained in:
@@ -44,6 +44,31 @@ StepDefinition::StepDefinition(StaticStepDefinition definition)
|
||||
surface_pressure_loads_ = std::move(definition.surface_pressure_loads);
|
||||
}
|
||||
|
||||
StepDefinition::StepDefinition(FrequencyStepDefinition definition)
|
||||
: name_{definition.source_step_name_raw},
|
||||
procedure_kind_{StaticProcedureKind::kLinearSmallDisplacement},
|
||||
nlgeom_{false},
|
||||
initial_increment_{0.0},
|
||||
time_period_{0.0},
|
||||
minimum_increment_{0.0},
|
||||
maximum_increment_{0.0},
|
||||
location_{definition.step_location},
|
||||
frequency_{std::move(definition)} {
|
||||
for (const auto& boundary : frequency_->boundaries) {
|
||||
for (int source_dof = boundary.first_dof; source_dof <= boundary.last_dof;
|
||||
++source_dof) {
|
||||
const std::size_t source_order = boundary_conditions_.size();
|
||||
auto owned = std::make_unique<PrescribedDisplacementBoundaryCondition>(
|
||||
SourceTargetQuery{SourceEntityKind::kNode, "", boundary.target},
|
||||
static_cast<DofComponent>(source_dof - 1), boundary.value,
|
||||
source_order, boundary.location);
|
||||
boundary_conditions_view_.push_back(std::cref(*owned));
|
||||
prescribed_displacements_view_.Add(*owned);
|
||||
boundary_conditions_.push_back(std::move(owned));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const std::string& StepDefinition::Name() const noexcept { return name_; }
|
||||
|
||||
const BoundaryConditionView& StepDefinition::BoundaryConditions()
|
||||
@@ -76,6 +101,14 @@ bool StepDefinition::IsNonlinearStatic() const noexcept {
|
||||
return procedure_kind_ == StaticProcedureKind::kNonlinearFullNewton;
|
||||
}
|
||||
|
||||
bool StepDefinition::IsFrequency() const noexcept {
|
||||
return frequency_.has_value();
|
||||
}
|
||||
|
||||
const FrequencyStepDefinition* StepDefinition::Frequency() const noexcept {
|
||||
return frequency_ ? &*frequency_ : nullptr;
|
||||
}
|
||||
|
||||
bool StepDefinition::UsesNonlinearGeometry() const noexcept { return nlgeom_; }
|
||||
|
||||
double StepDefinition::InitialIncrement() const noexcept {
|
||||
@@ -165,6 +198,15 @@ const DomainCollectionView<StepDefinition>& Domain::Steps() const noexcept {
|
||||
return steps_view_;
|
||||
}
|
||||
|
||||
const std::vector<MaterialDensityDefinition>& Domain::Densities()
|
||||
const noexcept {
|
||||
return definition_.densities;
|
||||
}
|
||||
|
||||
const FrequencyStepDefinition* Domain::Frequency() const noexcept {
|
||||
return steps_view_.Size() == 1U ? steps_view_[0U].Frequency() : nullptr;
|
||||
}
|
||||
|
||||
const std::vector<Diagnostic>& Domain::Warnings() const noexcept {
|
||||
return definition_.warnings;
|
||||
}
|
||||
@@ -227,7 +269,8 @@ Domain::Domain(ModelDefinition definition)
|
||||
}
|
||||
definition_.shell_elements.clear();
|
||||
|
||||
step_definitions_.reserve(definition_.steps.size());
|
||||
step_definitions_.reserve(definition_.steps.size() +
|
||||
(definition_.frequency_step ? 1U : 0U));
|
||||
for (auto& step : definition_.steps) {
|
||||
auto owned =
|
||||
std::unique_ptr<StepDefinition>(new StepDefinition(std::move(step)));
|
||||
@@ -235,6 +278,12 @@ Domain::Domain(ModelDefinition definition)
|
||||
step_definitions_.push_back(std::move(owned));
|
||||
}
|
||||
definition_.steps.clear();
|
||||
if (definition_.frequency_step) {
|
||||
auto owned = std::unique_ptr<StepDefinition>(
|
||||
new StepDefinition(std::move(*definition_.frequency_step)));
|
||||
steps_view_.Add(*owned);
|
||||
step_definitions_.push_back(std::move(owned));
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace fesa
|
||||
|
||||
Reference in New Issue
Block a user