Connect MITC4 drilling evidence across analysis procedures
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
#ifndef FESA_RESULTS_MITC4_DRILLING_EVIDENCE_H_
|
||||
#define FESA_RESULTS_MITC4_DRILLING_EVIDENCE_H_
|
||||
|
||||
#include <array>
|
||||
#include <cmath>
|
||||
#include <cstddef>
|
||||
#include <optional>
|
||||
|
||||
#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<Mitc4DrillingEvidence>& evidence,
|
||||
const std::array<double, 6>& 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<Mitc4DrillingEvidence>& left,
|
||||
const std::optional<Mitc4DrillingEvidence>& 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<double, 6>& 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_
|
||||
Reference in New Issue
Block a user