main
7
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
d344710305 |
test(physics): golden validation suite + C++ tests in turbo monorepo (#3)
* test(physics): add TMS Dynamics golden validation suite Cross-engine validation of Ymir force models against the TMS Dynamics 3.0 golden dataset (vessel1 VLCC). Strategy is state-in -> force-out: the golden motion trajectory is fed row by row into the matching Ymir force model and the result is compared against the golden per-force decomposition. This is integrator-independent, so it validates the force formula, not the time step. - GoldenCsv.h: header-only CSV reader (column access by name) - Vessel1Params.h: force configs mapped from vessel1.json, with the tonne->SI x1000 unit conversion documented (verified empirically to ~3e-5 on Fr_z) - TestGolden08Restoring.cpp: restoring (Fr_z, Mr_y) + heave damping (Fd_z) - Downsampled golden fixtures under tests/fixtures/golden/08_restoring/ - ymir_golden_tests target wired into tests/CMakeLists.txt Tolerances are set empirically and the residual causes are documented: the restoring divergence (up to ~6.5% Fr_z / ~13.5% Mr_y as pitch grows) is the off-diagonal hydrostatic coupling Ymir omits by design. Findings on squat (diverges ~4 orders — model gap) and the body-frame-flow forces (need TMS heading-convention mapping) are captured under docs/specs/features/. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * build(tests): run C++ suite through the turbo monorepo Make core/ a pnpm workspace package so `pnpm test` (turbo run test) runs the C++ ctest suite alongside the JS vitest suites — one command for everything. - Add "core" to pnpm-workspace.yaml so turbo discovers @ymir/core - core/package.json: add a `build` script (cmake configure + compile) - core/turbo.json: override `test` to dependsOn ["build"] instead of the root's build:wasm, so native ctest does not require Emscripten; cache off (native) - scripts/run-all-tests.sh: standalone runner (cpp/js/e2e flags) for running the C++ suite without touching the wasm/emcc toolchain @ymir/core#build -> @ymir/core#test: 270/270 tests pass via turbo. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * test(physics): add wind golden validation + reconstruct flow convention Extends the cross-engine golden suite to wind drag (scenario 02_wind) and adds the earth->body flow conversion needed by flow-dependent forces. - GoldenFrame.h: nautToBodyFrame mirroring NavalDomain — rotates the scenario environment (speed + nautical direction) into the body frame using the golden heading, so wind/current vectors can be reconstructed from controlDict + the golden trajectory - Vessel1Params.h: vessel1Wind() config with the full Cd(angle) table - TestGolden02Wind.cpp: Fwd_x validated to ~4% across the trajectory (residual is the rho_air constant: Ymir 1.225 vs reference ~1.27); Fwd_y/Mwd_z ~0 bow-on - Fixtures for 02_wind Documents the remaining divergences with measured numbers: current OBOKATA disagrees in sign and magnitude (Fc_x -83kN vs golden +172kN — sectional-area approximation + sign convention), squat off by ~4 orders. See docs/specs/features/golden-validation/. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(graphify): refresh knowledge graph after golden validation work Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(physics): align rho_air, squat sinkage, and damping norm to reference Cross-engine alignment against the TMS Dynamics 3.0 golden dataset (see docs/planning/force-model-alignment/). Verified against the reference engine sources in dynamics/nashville/src/*Forces/. - rho_air 1.225 -> 1.275 (PhysicalConstants.h): matches PhysicalProps.cpp of the reference and closes the ~4% wind gap. Wind golden test tightened to <3%. - SquatForces: fix double division by (rho*g) — the sinkage numerator is now volumetricWeight/(rho*g*L^2) (single division, matching the reference), not nabla_/(rho*g*L^2). Also use heave relative to equilibrium (z + draft) for the depth/seabed clamp, since the reference q[2] is waterline-referenced. Squat goes from ~4 orders of magnitude off to the correct order (partial: <=5% still blocked by the artificial 07 scenario depth dynamics). - DampingForces: the exponential-decay velocity norm now uses all 6 DOF (matching dampingForces/DampingForces.cpp); the surge/sway sign was already correct given Ymir's speedToWater convention. Restoring needs no change: the reference restoring is also diagonal-only, so the residual is a zero-crossing artifact, not a missing off-diagonal term. Full C++ suite: 271/271 green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs(physics): add force-model-alignment spec/design/tasks + findings TLC spec-driven planning for aligning all force models to the golden dataset: - spec.md: 11 requirements (FMA-01..11), tolerances, decisions - design.md: reference formula per model cross-checked with Ymir; root causes - tasks.md: atomic tasks + execution status of the first pass Records the key research corrections: restoring reference is diagonal (no off-diagonal), squat is a double-division bug, current alignment conflicts with self-propelled physics (reverted, needs speedToWater-convention resolution). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(graphify): refresh graph after force-model alignment --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|
|
213619b92c |
chore(graphify): refresh knowledge graph after ocean shader change
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
46e210437e |
chore(graphify): rebuild graph after thrust/rudder merge
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
2bb65da487 |
Merge branch 'claude/blissful-bardeen-867d5a'
# Conflicts: # graphify-out/.graphify_labels.json # graphify-out/.graphify_root # graphify-out/GRAPH_REPORT.md # graphify-out/cache/ast/015acc382566627aa180319545371357c08f5887a47a4aea29cc93a2882acb93.json # graphify-out/cache/ast/017c920749eabeb0628c353fe1a8651e77bb3c4465ce05c3aa11a2f2adc2aa58.json # graphify-out/cache/ast/02bb404d482818bb396d2a5da6db4e9ae93bbb9f5900dafc00460a3e6ffd0d4d.json # graphify-out/cache/ast/032be818f4f52c0287f5fdbe068ad272dde0bd44c96769dc3e0d9f8b8dc4f3ea.json # graphify-out/cache/ast/0386b8c9d34a328a6151cc6b0cc86ed70fa64d82aa166af5eb4446676dd26626.json # graphify-out/cache/ast/05bec1c738b9dcee56fcfb48c5d8c53b633f920d2537fc5c91ca70c82a99fc1c.json # graphify-out/cache/ast/0619b27196b60692cd1cd33aec075e009aefef502ffd88718246a5e8e7de8b3e.json # graphify-out/cache/ast/07abeabaf24317de02b3abbabf3fc9f4199b01ff63f620be677e67bc4aa8acf7.json # graphify-out/cache/ast/0cd8c5c1913454ab7e9f5591c54091b9ece293f15633f4a6bbd1bd0f24d262c2.json # graphify-out/cache/ast/0f75b9006f5d3bc4d5a1d766c245a46d1b61f219f47a6861ff200cc7aa763414.json # graphify-out/cache/ast/0fabca629bc140483e9fc4d3983799dd319ee7f94cc01194fca4e0051ea07321.json # graphify-out/cache/ast/118ec07005ae28950186651ec7bada8ec08b5c4fd16c3aa4d3d97a0410241f8e.json # graphify-out/cache/ast/11c140ceee99658ab87c8a2d8d09c59cf995093aefa7d449646231ccba513094.json # graphify-out/cache/ast/13d27df68cd4361ba9c26ca3f66ba7e5667af6f8902ba32815f3659fbec67862.json # graphify-out/cache/ast/14c2f75162ce685540f70acfae33a80af923b61f407c9a0fe79e379e51218e5c.json # graphify-out/cache/ast/15048a0e9439894c01c4ab2661d285815c3681b84dbea7a4206fadc2290b2fa6.json # graphify-out/cache/ast/1562eeae1acc4dcb71217cf97bd6836bfc1b0eae93c39df553bb528ca45acc43.json # graphify-out/cache/ast/15f10a776fee4390350b687dba0d5a0a302bc8bc1458502d8c036fe2ff1c9c59.json # graphify-out/cache/ast/185f0fa3f055e6f534640469495fd07358267795461b2a33d6dff8d9cfd375cf.json # graphify-out/cache/ast/1a4c65fb1ba9e91f69f68234e6458f83188a24ab1d93ae63b67aa340f9ebfdb7.json # graphify-out/cache/ast/1b3fd8e81db585ea0e810fc77d4aa1a74f222ab780c011185825c2ebe72aeca6.json # graphify-out/cache/ast/1b4da633d987eab61c873b3eeb81f735b17ce3ab739b9f988589c723ae3c750c.json # graphify-out/cache/ast/1b69778b7a2d0fa36296a78130e2145918ebc58896cf21ff8328805f0d7d509c.json # graphify-out/cache/ast/1c438b2e90aba925a35234b5a67349111b16f2836f2c35d524a8849e81fac60d.json # graphify-out/cache/ast/1d0cddbdd0a14bc29429abfd792e5758e3cf68b14a5b3c20915c9c36fc18733e.json # graphify-out/cache/ast/1d6dbc0e6f96b30a72e0464ccc061e691b0804705b20c62058b14eec5fa35ee0.json # graphify-out/cache/ast/1dfa951542ac029ba67391afb1a4fa09a36d3e32967773e6f7ee13e53a9f399b.json # graphify-out/cache/ast/1f76c518b96c2ab5197bc27c34a51d1ca4a320058ce09403140cd5bd4124ab78.json # graphify-out/cache/ast/1faff5fec788636ae76402a4e0906c8e998be5d0ae95e6efd1709facba363d9d.json # graphify-out/cache/ast/213f528bd368e30f958e1e4fca41090d61e9bb133860e797e529c74c4bc7e602.json # graphify-out/cache/ast/22e92f7050a6afcd34f74c9a704d79435864059211d48df63de989105d92b80b.json # graphify-out/cache/ast/23bf73aa6337e5f144d46932a531e18aeb94e795eccc28dde347c2700e497d59.json # graphify-out/cache/ast/240b3be31bb05d7861177fb86f928718cd0a6e7bf0cda700fc02f0288d408981.json # graphify-out/cache/ast/25d9e3f0cffd9d2271b3efd01d292ad4705756f8fdeffdd90bd7ba92fa41e542.json # graphify-out/cache/ast/262fdccde024f326e19e3eb71e52d83317c0fa61877b7e226e2add8f78da2f71.json # graphify-out/cache/ast/2638c898f7a842b802cd22a46d34151cd4818962859ac82c78973a301643b60b.json # graphify-out/cache/ast/26c8106ff6c20a0e9df828ef869c0075efea4ae409f86e35d14921f5a5061952.json # graphify-out/cache/ast/28cb34ed93f8aab13417807ce6194e0510bf450f147677b4e4ef19771054b6e7.json # graphify-out/cache/ast/29608e41ab563c2e22fa256c62feffb136fa1f34f724ba755593c5c031881080.json # graphify-out/cache/ast/2d53b4c749155421e120e5c8d7a73844e2bf70552769f584c3f5bdf6a6cb293d.json # graphify-out/cache/ast/2d661470f4f8852fee9ffff14a9416ed50e3c3983e98b7b3bd578a0cb68b83b6.json # graphify-out/cache/ast/2d7aca7d4c3ac1f39bb143905fa23fe1d8069539762839bcd2d483cea11e2905.json # graphify-out/cache/ast/2ee922f85a14e3bfdf8ee60689203dcfeef4a2eaf1d994e3796b90586cf4268e.json # graphify-out/cache/ast/2f348d2d18130301d162ff51606a86403557c57de0c8e6d42ec44f35499703f9.json # graphify-out/cache/ast/3036f69980a691c963a675eaf679315968b255752ef78632aaf0f29869c204e0.json # graphify-out/cache/ast/3079e42eed1e72dc8343e536686c6a30e1d6e2cf2991d2860117699d2ac69f99.json # graphify-out/cache/ast/37c133b4197e925954db31a015ea25c40e7f1fb41dc356deb188fcdfa29eae84.json # graphify-out/cache/ast/3bf16c70ca0501960bc013646317cad859cd65a98943a51e195ecbd055494bf4.json # graphify-out/cache/ast/3f495fa19f43c6c364310672f6d52183887e41bdb1c47d10291522b5fdd3a5ce.json # graphify-out/cache/ast/406abe26502227ecae27c495a358aaf321decd587435b407aa26906f3e23f894.json # graphify-out/cache/ast/40c2fde4bb9861e35120ce1d9362450a1fcf12c14fc0337d4bdb45623b05ca61.json # graphify-out/cache/ast/411f1c07fceeebfa0a95da7a523b481aa71dc14b6e8a0b2ca7608d29eec28a38.json # graphify-out/cache/ast/41cd77bee47da44192195306b9ba847ebf395e612f3cc5dc93712f11b03324a0.json # graphify-out/cache/ast/476f44883e1577421c7e9a52fb1ea58145efd4cc821ce7438d546f3f6edc0a39.json # graphify-out/cache/ast/47ca8aa961f2a08daa7d9002c20c4478e46a759da092c36f9928505f0993517f.json # graphify-out/cache/ast/4901cc207ef8b2f5d4b6eccf7cf673e4ec52e042b749a00ba7555a1f7c9db704.json # graphify-out/cache/ast/4b5bbe0f4883302b0c0b9455ae998fe355f2604a958690ce005250205fd72276.json # graphify-out/cache/ast/4c8fe25ccdc6ef2b794d033c035fa43b348c20cb1edc246fe2bb5bf3d6d3477c.json # graphify-out/cache/ast/4ccc4a9aa7e10f491aa8e2690356bb9c71b94e6fe2fdba96d57c0d1fc014b91a.json # graphify-out/cache/ast/4ebd205db4403623c16ebd3dcaab72eb920383c23cc64d0f7b0f87a6251def39.json # graphify-out/cache/ast/4f793aa63af019eeeeac180ca879fdaeee149b5897e01a1dab9563536d19c135.json # graphify-out/cache/ast/509c521d0ccd3e7f3425221b4ec55dcc6bc2f97120ec7e91ca330da830bd9158.json # graphify-out/cache/ast/50b6735ac808a521c08ccf03c0a35cf2f8caf1a6ce09b7ccd9afbf9c0e337d0e.json # graphify-out/cache/ast/51d13c51d9494313135184f3242aebbf4ae1078c3cb9ebfddd03c167bd6744f8.json # graphify-out/cache/ast/544bb13249f97e7170bd6ed65306e71f703fe0539b1676438de796523d471e65.json # graphify-out/cache/ast/55971f0aaee65f23b54d80af49e8adb3026630d4bd66ac85f7f233dab96ba979.json # graphify-out/cache/ast/5603c4c200bc015940436a58d1b0769a4b27f96bf625163d8a9f578d6c895745.json # graphify-out/cache/ast/569a92bbe0ca8b0847e14573322c1724c571b01c0aa887e42e43c50eb35ed387.json # graphify-out/cache/ast/56b3435f15a511ea4d8ef3111992ea105358311f04812cb24834d488dc9cdea0.json # graphify-out/cache/ast/5902b074c96bcdc1ccd913547dbb9abe96c8c0fd051ba7bd162e86f62cc2b607.json # graphify-out/cache/ast/5aa348216901eb2d073f7c24db858616d1c5494deb71b2797d43dbf272a510c0.json # graphify-out/cache/ast/5acefe9eed9f304573bfaa6f36032d4d52576f4fa0a8e9f3326cb8c77857915e.json # graphify-out/cache/ast/5c46078e067b4e73f039545fe2cc775aa95d7fce417e8eaae33ca9c2191e79de.json # graphify-out/cache/ast/5d4ba5f52c1a14019ee2ba2789ca81a38147f5c0c17652e6e903d29579b595b1.json # graphify-out/cache/ast/5de669f4acdd8a25d04410f8530f4b547f07cf32fca48821392abccfb12a3dac.json # graphify-out/cache/ast/5e69af6c6232de29dc069193e0eb63d28085e3aa1ca758d95c5605b0eb88924a.json # graphify-out/cache/ast/601e5029f901a2a8e626649a0ba4a8260df2c55167467d4a4b67dc00e02c7735.json # graphify-out/cache/ast/60977c9741d2d9b7b57f895d546150070f21a9863c84291216f1a4b20ed74e80.json # graphify-out/cache/ast/620c7c874a7d671d8606acaf433e451b9a7ef506191833f653c766bf3bb53d38.json # graphify-out/cache/ast/626894cfb6107be4efe06a3b7c49526f43044428bcfbded1d8cf86309ae16743.json # graphify-out/cache/ast/646eb4c7076f7473957a1d2e5dc7e03427d04edb7f09e085b35aa1307a25f67e.json # graphify-out/cache/ast/65d0ae961292977cd3dcb360e2fdd8ef3d97feb66c9c80e04fee45b5347a0826.json # graphify-out/cache/ast/67112404942351d8d09f9a2bfb784263560a86b7928cdc790c5bcd3f9f2dd88d.json # graphify-out/cache/ast/6abf183635da6aa36a6c466983f07909d8b3cb7aaf8a8129a1b8e6e66a402b1c.json # graphify-out/cache/ast/6bceb9b5db4fdff26ef15c41b0ff5448e5f9cab0a3e5574ccc8c053d0a73433b.json # graphify-out/cache/ast/6c7711afbe0b354e351b6449c831b7314ebde3279ef2b6c79e05c6521312b01b.json # graphify-out/cache/ast/6f0a7ef8be4d3679bfb4fe55199e08dd59d2882f6b05b690d736061a24c6ff28.json # graphify-out/cache/ast/706471a4faf683fe03bfad74325ad204077a50d8ea1c7ecd6f9b88c548370d35.json # graphify-out/cache/ast/72db5958a76b5f8d20e68bf95d68d21a0a5a9283809fe6858b945167c7b12182.json # graphify-out/cache/ast/74a4faf54ab08f923941e527556c591578853cf82a3117445078f8a0046ed54a.json # graphify-out/cache/ast/74d01e9657c6fdcaddb52642e12bdba399fafe46afe41e9b49acb41ba9625a45.json # graphify-out/cache/ast/759e4b4984fa124d5876fc456b7cf0501d521ee59710f7aeb8b2b42f12af6eae.json # graphify-out/cache/ast/75a764266aa23730a07e21321dd5530bd064ada4923befa4d3d4f3428d0f9ab1.json # graphify-out/cache/ast/76a7329f9dee3952e71ec169886bde7b2d409c8564e59a719bf77fc155d6058e.json # graphify-out/cache/ast/78d897a316216c4f46ebafaeddf3435f0ea5e732553b9b522a7aa26d46026ff7.json # graphify-out/cache/ast/7a93ee44f5f969d0745ec40e3920c6cffd213fc81bde3a921a4e03ec8681021d.json # graphify-out/cache/ast/7bbfba34acefed77733a5e27ff5e3ac3a27dbf467a4bcd7cc3f60a0a22b0b83e.json # graphify-out/cache/ast/7cc2c5f4af03589c876ae7a166cdc895f3032ad1313b1d14e4af8f6c4dee2df7.json # graphify-out/cache/ast/7d7e9a830965611804462d7919c1ed4c0ed9d9424f469bc6a50a7eb7a8ce6d6f.json # graphify-out/cache/ast/7d93cfdd5bd1a1d53c15f4354461df51da66acb6defd51f258d9d2601ef5e3e3.json # graphify-out/cache/ast/7ea2ce6711fa86fb0446db6c9ef3a5f6bda1761a8fd78607bceb955bc0e82149.json # graphify-out/cache/ast/7ed5887ca65b3a8ae0b6f2c2ed9668b092aec0b40c87aedf22a093885c2210a2.json # graphify-out/cache/ast/7ef6d31615630cd78c905954f0aabcde9a1f672d7f6e2b1616c225f71775a134.json # graphify-out/cache/ast/8032dfa4c8cdbf20713f8cf1d1fe293471660a010b8c3c7ac85bf4a0246529a8.json # graphify-out/cache/ast/80a2baf50998d72fe8e599bc7efc9796038dab57e8793f5f189f4cce74de4f8a.json # graphify-out/cache/ast/811d084fbc17781c670aa704b3ba2836a7a263190fbf37f9e9e8061fb56e493e.json # graphify-out/cache/ast/81f15787e05a77448f991d2ad8333cf868d1f5bf90ff5807db36f0eb740070dd.json # graphify-out/cache/ast/835787a94b4e6cbd08d74514489e560f1eeb6bbf66f5e9ca1091b6893a338fe4.json # graphify-out/cache/ast/84806dc56b130e8800d55854f8f0510fb3c26edbe523a234020198dbe3ed7fe5.json # graphify-out/cache/ast/88ed8c68e3f739b7dfc2ff8212ca578ab7d182b6096ba18bfb1224574ec9e32d.json # graphify-out/cache/ast/8cde0f77fe0e1308757c796e9a6c892b23a9f6c55557e1256341f40e83c7d9a0.json # graphify-out/cache/ast/8d82c44a9fdfa184eba3247c785002e0e7a248de116bfc8f9bcfafa9a6cfade7.json # graphify-out/cache/ast/8d92b9965d04f435cebcf79a9a6c246ba3f11f42b6d73f8a6d22f3436d9fb611.json # graphify-out/cache/ast/911e755919cb410a2fa03fac6b41300a4ea892f63ec6670bbb552491821b5551.json # graphify-out/cache/ast/9156eb467ad6ce799ba07d294049ce4168a3b4a0bd58ba555c606abdc8d82315.json # graphify-out/cache/ast/91df9753645deb33974469dbd26ed3fa6aa6b21579b2a9507c3cb4c5cbda550e.json # graphify-out/cache/ast/94685ad4ddc950e03388b61451ae10bcf9f8e1480e9430ca9764001a543ed954.json # graphify-out/cache/ast/95dfa4a6cef29df93d457ae1692ca66d3c4ae580d3c60aa9238c229c9f641c33.json # graphify-out/cache/ast/97ca98c1c8ac239ac9dcdaeb7f07053e07fc87407f8f81c4c2d48c4e1eca0980.json # graphify-out/cache/ast/98c1630011eddfd63ed7a223758384467b4db2d9dd2e1638b40139611de28374.json # graphify-out/cache/ast/98ff0816ba46499294ddf13a8fd45506ee18454eba1a1659a1208f64865d7555.json # graphify-out/cache/ast/999b66437b7ebac5f592cb86a4717c56cab4123cf68d8f99fdc0d864deecf04b.json # graphify-out/cache/ast/9bee7fcda55d1ac35d449e0dc471fa2f08afcc8b531695e3475253a099f8af91.json # graphify-out/cache/ast/9cc65372df2cfe45423354415b1c2e470578f0de7c2c0a658b99e9136305f829.json # graphify-out/cache/ast/a02ef60412e37afc347f19797180542d479d46fd93204bdfd5f3958c647c44f2.json # graphify-out/cache/ast/a0b01e75104f8be620edfb2ee60c6c0b048d0f79ab9cc58c7e5ebff8497e9de1.json # graphify-out/cache/ast/a0e24f786ac1963e26a2153307a76c40da6d32f3391180540ee3e3bc0626f1d2.json # graphify-out/cache/ast/a2c4a502b97ddfc1d776bf9cf286860e230b08ee471050abd6648b00eb4a3642.json # graphify-out/cache/ast/a4dc3278f2a6fa8209680425e0eb4c9cf6f493f4ec78bb9be74284bfcc013074.json # graphify-out/cache/ast/a59bff5f300f7416a3495628f9ba419ef1ce88f99507dc539df18c2346811a6b.json # graphify-out/cache/ast/a62869b6c8290dfed475adfcb3b9a900cc6448136d906858d5384a7e1fdbbe2d.json # graphify-out/cache/ast/a655cdf7e50bd662055d7d2c55e052e1105afa51aa70598e15b395080c3eaa2f.json # graphify-out/cache/ast/aa7a6db975b4f038c05792a9c74719268050c3e5209a66beeaada978bc095280.json # graphify-out/cache/ast/ab442f729c3b475d7a34c7ce35cb8dca96c95ddd5a107fcbde5de5fd59d6a05b.json # graphify-out/cache/ast/ac1631b1ec3e411962a1a7d94c868dc99245102fd32d86662d504fd9bed6ed5e.json # graphify-out/cache/ast/ae83cc8fdece825c1df87877fb8dc96c0de572c5718ce742914d365d91d7c3f0.json # graphify-out/cache/ast/b0a882ffd27433ca6d24bd0d0cfa254fda6e9b018a58b071408f3631a20579e7.json # graphify-out/cache/ast/b506daf8c12d4722400536b874fa921085fea12f6dd78dd96f27ca3e68a7cda8.json # graphify-out/cache/ast/b61bc9a6b7c54440eeccb60306fe25ae8f953ca437f79b451643c876d976e570.json # graphify-out/cache/ast/b6702c1e589c9053c028cc1524fdc9f071471d7b0b7822130a15eaf80398ac4d.json # graphify-out/cache/ast/b7436032e0966a595f89106401b68883700310b9331c66e325c9b4c3f3412fa2.json # graphify-out/cache/ast/b799a03aa359572045c123047f32e211ca894c25814b1b702395a181ce4d148f.json # graphify-out/cache/ast/b7df22b1b67009a2476540e492f3976335d9022320edfed7bc4767477a424a68.json # graphify-out/cache/ast/b8e20667b9966767d0494c73b4f8bf5830ecaf3c5a8adf8728ff82ac18c83baf.json # graphify-out/cache/ast/b8e8d5e7b16c25a93c33288785977f58ba4b1226e5f4f923813cd8a14f6fbdd6.json # graphify-out/cache/ast/b9417347509237c95d90de7fdac2fd6c3c5ba991f032571410e5ad8992f045c5.json # graphify-out/cache/ast/b9b814e3148d62878bb20b0ff678ce1e25498ea29f271c3f4a09a93438dbe5ae.json # graphify-out/cache/ast/ba7a6fc70308aaf08b88b861b0d724fd109f325aea0b822dd2cca4822add87a9.json # graphify-out/cache/ast/bca9888303af3b839226255a91df8bd4b19c1db6ce74f29ed6bc410f7e7c5b18.json # graphify-out/cache/ast/be3f08b28f604970e348a203680762cc6ec0b67b9243f7b01a9662ba6124d981.json # graphify-out/cache/ast/beba6e88699e2ec52070f9c9d4e02ec477ef2b0f824b49e97f2a8b76181e7b55.json # graphify-out/cache/ast/bedf76d5bd2bfdac7b1c73005218191c931706f02c8f2e5ba673162af9bb047d.json # graphify-out/cache/ast/bf0e841ccf76e113cbb4e2f600509cd03485b7ad23f63b88bce847c4bb6e6ad3.json # graphify-out/cache/ast/c21c43704c674f6246db5aaf9c2f1e9aa7f0f49eb879341cb14f4ad27b12b814.json # graphify-out/cache/ast/c398fe1446f826334550c97fe9c04917bb4b7e62e7aac2e3b3e831f5f1a25e28.json # graphify-out/cache/ast/c5ae2126c88a935af26675c52bbc5b1c73eb7d99b61411c171288ff225d7a60b.json # graphify-out/cache/ast/c66304c501839fa37c53edf4efde653779ac2e57773143467eb51430fb6f8ca3.json # graphify-out/cache/ast/c6ae350562d8dc3000d162097c3d3559c158c6dffc59652d82bbee9e6d16a3fa.json # graphify-out/cache/ast/c830c73ef39e4ae0b88b3b336ec9e7c28dcb8293a93e446364da975b9b5eab05.json # graphify-out/cache/ast/c92850be84c6f121f78d4fe6bbabd1ab96771b19679c9b43a999f2187bc7eb6d.json # graphify-out/cache/ast/c954349472ec1162a3415475000bceb1ee14a19bb3bbc6deb498cf2784f8e740.json # graphify-out/cache/ast/ca1fe67c8ce02f33cf4586b9fefcf9d23b9ff27a415d8afff5b20b4461a126f1.json # graphify-out/cache/ast/cb6df0f9a8c168cc4e86d5ec4800f5ac386c7d7add9094b75eced1d9ca4fd80c.json # graphify-out/cache/ast/cbd41496cc6f9b97ac51ac140f23f06a94c1fa9481d8bdd8eca4faae067c3171.json # graphify-out/cache/ast/cc851839b4836c6af7693b19f7a823c9a0949a0000c93d75203ed51618d7aa27.json # graphify-out/cache/ast/ccab1e0d3436de2a8431fba64c15b541b1dc98096b2f215d4050d5de87bda7e1.json # graphify-out/cache/ast/ccc142338717ce7f2a25bbe56f04af85019859a2f82eb236489c183b94187563.json # graphify-out/cache/ast/cd00dc5c8ccea8a4a640d0694d16959b80c1fda30b5d577d5755cfafde5a0d9f.json # graphify-out/cache/ast/d08da44e6ddce210099ea44ee1fdc7fab8bf1e3236fdc9987233bef0aee9f507.json # graphify-out/cache/ast/d4383255b0e7fc955de9241547674b82237080b0dd402b7d124a8e901ae614f5.json # graphify-out/cache/ast/d46318cc213ded165e17b4c54de1f5f7cb04a2ea7d270c89d5311b2baa7d76ee.json # graphify-out/cache/ast/d80ad1e79c1c3e855c04c6312df9e4f0d91f1563178c9c9ecccb1558ebfb6ff9.json # graphify-out/cache/ast/d9404da8d5eb30d14a37e3e05d30480f0e152ab56f435765f9057f30bb3d0a55.json # graphify-out/cache/ast/d976ae07ac8e8afb36bb49face0e4052f1d71579a90b9e086f3036c316a448e6.json # graphify-out/cache/ast/dc67b9b1b4bc8119ebe16b3466474c727b78d20bb038cf92fb3917e672cf7e01.json # graphify-out/cache/ast/dc869dca6066a7c7facc2f54ac95a87d7fc96d3197a60b9fad565c2478b38569.json # graphify-out/cache/ast/dddb09d627f2d2aaea30af4b272e484987d70f6871d4b2271bc655251a4713c0.json # graphify-out/cache/ast/df3827a7d357e1c23951894d78f9a6c99f22a74461739191323dc55626ac325c.json # graphify-out/cache/ast/dfb4cf41a62e0649e54366f4c1fea9e8dad457b8cb8fba45f2b668ba31b6a324.json # graphify-out/cache/ast/e0c620ed5f7e095dd095f782ef78868260518bbb9d3f2fa91be48b188fc4c3e5.json # graphify-out/cache/ast/e4960bb42960e493e8426a6bd3616353422fa9cfad430ae804c04dd9f262e055.json # graphify-out/cache/ast/e4fbaa1d8c8f60b934d85f5c95196bb5d647e171335ca13a9dae9153d57e7f9b.json # graphify-out/cache/ast/e64256e07b2d4bcc8615cef2c2c8506022aea97fc48b27d0bfb9297f193cee6a.json # graphify-out/cache/ast/e65beedfa03ee68044b5078ab9e4127ae7950713d276e04ec90f3314b33008b7.json # graphify-out/cache/ast/e91b29bb690da2be2a3687a128c01f78bd2664b437495d40ef3daed5c0c41aa6.json # graphify-out/cache/ast/ea3453c3586ef033fe1b37a06198ccab31aac714cb8cf93e63a173d78fe5810c.json # graphify-out/cache/ast/eadaeb72cdef28cc1dd90c8845d8dfd4530d8903bfd9d195efb5a3389af47376.json # graphify-out/cache/ast/eb4c69848ffa5e9c98063304726a06182a552016cb00541ed9ab458430418eb2.json # graphify-out/cache/ast/ebe08df3af3aeac5db9be0dbabf28fa3784b99e343fecfd8028c65c113219b6a.json # graphify-out/cache/ast/eeb436b2e836eb7cb2d5dd5b281870f52fb5e70a83ce42401b5dec3a7f32e6f3.json # graphify-out/cache/ast/eebcf0b5fb35b71883c5e9df17ab1c2f91cf6703f1b845d5fc8db9084109b455.json # graphify-out/cache/ast/ef05010b54ff63a5e77ce71ae47db6daa5f72b1011e336b2eadcdfb9351040c5.json # graphify-out/cache/ast/f12c08655e558ff4410b582ec1e0bdde6210b81fe1d8c3b9c58b71ee55107df5.json # graphify-out/cache/ast/f24a902f9626c6c5d51ab6cba7d7486be7158b8a2eb82a44eb4c9f024e94bf8a.json # graphify-out/cache/ast/f252b912b48f11612ea063505414b3ff19c1c25521273afb0e529adc62c93d3b.json # graphify-out/cache/ast/f33662761c65f8a2e6ffff1fd329f23fc9cbcc3378fcf5e3a3870bdbbd1d4b02.json # graphify-out/cache/ast/f399f2a9cc054553fa8e480feab92634694793a6270ccecdc35164ee9c86fc3c.json # graphify-out/cache/ast/f59beda214055602eab63bb10f396a15f3a9dfa1d4bc22869153e966c00e7968.json # graphify-out/cache/ast/f757aa67a89f1ad1abb48e708de15a9b74ebb4b3f258c945e6ca08ad0f4daafe.json # graphify-out/cache/ast/f86f05b6ad5b459a6215cb70309d2f3cc76da570266ef247cdd1e3724ad5fdc3.json # graphify-out/cache/ast/fae798b816028d124b462ecd75832f048c6890dfc10f3b9e00189af8158eb28b.json # graphify-out/cache/ast/fe54299d38ff88dc14c9f9ac564e82de3d7e1a60aca94247328b507f32eb4838.json # graphify-out/cache/ast/febbd49e5bbbbaca4c2c0c8fe58c42b3b444d05081aff95466fe7eec90e4462a.json # graphify-out/cache/ast/ff31b1ea267e8101ab058ef141e48736c2777951f72793345aefc2326999b794.json # graphify-out/cache/stat-index.json # graphify-out/graph.html # graphify-out/graph.json # graphify-out/manifest.json |
||
|
|
d7de0e51ff |
feat(physics): match propeller thrust to MATLAB dynamics (D3)
Replace the crude Kt = 0.4*P/D - 0.1 approximation in ThrustForces with
the full open-water model from dynamics/thruster.m::advanceStep:
- advance ratio J = Va/(pitch*n*D) from speedToWater + yaw-rate lever
- clamped piecewise-linear Kt/Kq interpolation on the {J,Kq,Kt} table
- shaft torque Q = rho*|n|*n*D^5*Kq and power P = 2*pi*n*Q/eta_mech
- 10%-per-iter power-saturation loop (<=60 iters, maxPower==0 -> n=0)
- transverse-speed reduction `reduc`
- astern efficiency on reverse-operation XOR(rotation, pitch)
- paddle/side-wash force, active only astern
Extend ThrustForces::ThrusterConfig with openWaterCurve, rotationSpeedMax,
maximumPowerW, mechanicalEfficiency, asternEfficiency, transversalSpeedLimit,
transversalReductionCoeff, paddleCoeffs; add getTorque/getPower telemetry.
Empty table keeps the legacy linear-Kt path so existing tests stay green.
Add Catch2 tests validating Kt/Kq interpolation at J=0 and J=0.25 against
hand-computed values, power saturation, astern penalty, transverse
reduction, and paddle force. All 262 ctest cases pass.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
||
|
|
90006bc246 |
feat(physics): match rudder forces to MATLAB Dynamics (table + slipstream)
Replace analytic thin-airfoil Cl/Cd and simplified actuator-disk inflow in RudderForces with the MATLAB rudder.m model: - Interpolate Cl/Cd from the rudder coefficient table vs inflow incidence beta, computed from actual longitudinal + transversal inflow (current, sway, yaw-rate lever). - Propeller slipstream: p1 geometric factor x p2 actuator-disk term with hull wake efficiency; degrades to free-stream when the propeller is unloaded. - RudderConfig carries coefficients table, thrusterDiameter, hullEfficiency, p1 (drops unused aspectRatio). - Wire a representative balanced-rudder table + computed p1 through the WASM binding. Add Catch2 tests: Cl/Cd table lookup at known beta (exact node + interpolated midpoint) and slipstream amplification with an associated thruster. Update existing rudder/integration test configs for the new config shape. Full ctest green (257/257). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
e41bd4b960 | Refactor code structure for improved readability and maintainability |