#ifndef FESA_RESULTS_MITC4_DRILLING_EVIDENCE_H_ #define FESA_RESULTS_MITC4_DRILLING_EVIDENCE_H_ #include #include #include #include #include "fesa/results/result_records.h" namespace fesa::results_internal { inline bool ValidDrillingMode(const Mitc4DrillingMode mode) { return mode == Mitc4DrillingMode::kDirectSpring || mode == Mitc4DrillingMode::kLegacyCorotatedTwist; } /// @brief Validates exact raw-minus-internal diagnostics without a tolerance. inline bool ValidDrillingEvidence( const std::optional& evidence, const std::array& raw) { if (!evidence) return true; // Older manually constructed fixtures. if (!ValidDrillingMode(evidence->mode)) return false; for (std::size_t i = 0U; i < 6U; ++i) { const double expected = i < 3U ? raw[i] : raw[i] - evidence->drilling_moment[i - 3U]; if (!std::isfinite(raw[i]) || !std::isfinite(expected) || !std::isfinite(evidence->equilibrium_with_drilling[i]) || evidence->equilibrium_with_drilling[i] != expected) return false; } for (const double value : evidence->drilling_moment) if (!std::isfinite(value)) return false; return true; } inline bool SameDrillingInventory( const std::optional& left, const std::optional& right) { return left.has_value() == right.has_value() && (!left || left->mode == right->mode); } /// @brief Keeps force balance raw and subtracts positive artificial moment once. inline void CompleteDrillingEvidence( const std::array& raw, Mitc4DrillingEvidence* evidence) { evidence->equilibrium_with_drilling = raw; for (std::size_t i = 0U; i < 3U; ++i) evidence->equilibrium_with_drilling[3U + i] -= evidence->drilling_moment[i]; } } // namespace fesa::results_internal #endif // FESA_RESULTS_MITC4_DRILLING_EVIDENCE_H_