perf(math): route ordinary products through MKL and preserve arithmetic
This commit is contained in:
@@ -248,8 +248,13 @@ Result<SolidFrequencyState> ExecuteCandidate(const Domain& domain) {
|
||||
mass_phi.reserve(count);
|
||||
for (std::size_t c = 0; c < count; ++c) {
|
||||
Vector vector(k.Rows());
|
||||
for (std::size_t row = 0; row < k.Rows(); ++row)
|
||||
for (std::size_t row = 0; row < k.Rows(); ++row) {
|
||||
vector[row] = state.backend.eigenvectors(row, c);
|
||||
if (!std::isfinite(vector[row]))
|
||||
return Result<SolidFrequencyState>::Failure(
|
||||
Failure("solid-eigenpair-validation-failed",
|
||||
"Modal mass is not finite positive."));
|
||||
}
|
||||
Vector mv = m.Multiply(vector);
|
||||
const double raw_mass = vector.Dot(mv);
|
||||
if (!(raw_mass > 0.0) || !std::isfinite(raw_mass))
|
||||
@@ -257,6 +262,12 @@ Result<SolidFrequencyState> ExecuteCandidate(const Domain& domain) {
|
||||
Failure("solid-eigenpair-validation-failed",
|
||||
"Modal mass is not finite positive."));
|
||||
vector.Scale(1.0 / std::sqrt(raw_mass));
|
||||
for (std::size_t row = 0; row < vector.Size(); ++row) {
|
||||
if (!std::isfinite(vector[row]))
|
||||
return Result<SolidFrequencyState>::Failure(
|
||||
Failure("solid-eigenpair-validation-failed",
|
||||
"Normalized modal vector is not finite."));
|
||||
}
|
||||
mv = m.Multiply(vector);
|
||||
const Vector kv = k.Multiply(vector);
|
||||
const double lambda = state.backend.eigenvalues[c];
|
||||
@@ -362,6 +373,10 @@ Result<SolidFrequencyState> SolidFrequencyProcedureExecutor::Execute(
|
||||
return Result<SolidFrequencyState>::Failure(
|
||||
Failure("eigen-allocation-failed",
|
||||
"Solid modal workspace exceeds addressable storage."));
|
||||
} catch (const std::runtime_error&) {
|
||||
return Result<SolidFrequencyState>::Failure(
|
||||
Failure("eigen-multiplication-failed",
|
||||
"Solid modal sparse multiplication failed."));
|
||||
}
|
||||
}
|
||||
} // namespace fesa
|
||||
|
||||
Reference in New Issue
Block a user