Files
Ymir/tests/world/TestWaveForces.cpp
T
vinihcrosaandClaude Sonnet 4.6 b11c4be0c5 refactor: reorganize repo into libs/ domain structure
Move files from flat core/naval/adapters layout into libs/{common,physics,simulation,vessel,world,persistence} with updated namespaces, CMakeLists, tests, README, AGENTS.md, and Doxyfile.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-25 03:34:51 -03:00

67 lines
2.1 KiB
C++

#include <catch2/catch_test_macros.hpp>
#include <catch2/catch_approx.hpp>
#include <ymir/world/wave/WaveForces.h>
#include <ymir/world/wave/WaveSpectrum.h>
#include <ymir/vessel/NavalContext.h>
#include <ymir/physics/BodyState.h>
using Catch::Approx;
using namespace ymir::naval;
static NavalContext makeCtx()
{
ymir::Vector6 q{};
ymir::Vector6 qdot{};
ymir::BodyState bs(q, qdot, 0.0, 0.1);
NavalContext ctx{};
ctx.state = bs;
return ctx;
}
static WaveSpectrum makeSpectrum()
{
WaveSpectrum::Config cfg{};
cfg.spectrumType = WaveSpectrumType::REGULAR;
cfg.significantWaveHeight = 1.0;
cfg.peakPeriod = 8.0;
cfg.mainDirection_deg = 0.0;
cfg.seed = 0;
cfg.n_frequencies = 1;
cfg.n_directions = 1;
return WaveSpectrum(cfg);
}
TEST_CASE("WaveForces constructs with WAMIT tables")
{
WaveForces::Config cfg{};
cfg.wavesOriginPosition = {0.0, 0.0, 0.0};
// Minimal 1x1 RAO table (1 frequency, 1 direction)
cfg.wamitFrequencies = {0.785}; // rad/s (8s period)
cfg.wamitDirections = {0.0};
// RAO magnitude and phase for 6 DOF x 1 freq x 1 dir
cfg.raoMagnitude.assign(6, std::vector<std::vector<double>>(1, std::vector<double>(1, 0.0)));
cfg.raoPhase.assign(6, std::vector<std::vector<double>>(1, std::vector<double>(1, 0.0)));
// Set heave RAO = 1.0 (unit response)
cfg.raoMagnitude[2][0][0] = 1.0;
WaveForces model(cfg, makeSpectrum());
REQUIRE(true); // construction succeeds
}
TEST_CASE("WaveForces compute does not throw")
{
WaveForces::Config cfg{};
cfg.wavesOriginPosition = {0.0, 0.0, 0.0};
cfg.wamitFrequencies = {0.785};
cfg.wamitDirections = {0.0};
cfg.raoMagnitude.assign(6, std::vector<std::vector<double>>(1, std::vector<double>(1, 0.0)));
cfg.raoPhase.assign(6, std::vector<std::vector<double>>(1, std::vector<double>(1, 0.0)));
WaveForces model(cfg, makeSpectrum());
NavalContext ctx = makeCtx();
model.bindContext(&ctx);
REQUIRE_NOTHROW(model.compute(ctx.state));
}