rtx-cfd (18,715 lines) and rtx-fea (36,576 lines) both exist and nothing
connects them -- rtx-fea is commented out of rtx-cfd's dependencies. This
is the coupling layer, and it is the piece Prof. Charbel Farhat's 2026
Guggenheim Medal citation is actually about.
It depends on NEITHER solver. The properties that make a partitioned
coupling correct -- conservation of force, moment and interface work --
are statements about the transfer operators alone, so they can be
validated now, on solvers whose canonical-benchmark validation is still
outstanding. Adapters to the concrete solvers belong above this.
TRANSFER (transfer.rs). Weights satisfy two constraints:
sum(w_i) = 1 partition of unity -> force conserved
sum(w_i x_i) = x_face linear reproduction -> MOMENT conserved
The second is the one that gets skipped. Inverse-distance weighting
satisfies the first and generally violates the second, conserving force
while corrupting moment -- which shows up as slow spurious rotation rather
than as an obvious error. Underdetermined for >4 nodes, so it takes the
minimum-norm solution w = A^T (A A^T)^+ b.
That is a PSEUDO-inverse, and not for defensiveness. A wetted surface is a
surface, so its nodes are usually planar, and for a planar patch the z
constraint row is an affine multiple of the ones row -- A A^T is genuinely
rank-deficient. The constraint is redundant there, not unsatisfiable. An
ordinary inverse rejects the most ordinary interface there is; I found
this because my first test fixture was collinear and the code correctly
refused it. Constraints are then verified against the weights actually
obtained, since a pseudo-inverse returns a least-squares answer whether or
not the system was consistent.
Motion transfer uses the TRANSPOSE of the load operator, which makes
interface work conserved identically: (Hf).v = f.(H^T v). Any other
pairing leaks energy every step, and the leak looks like physics until it
destabilises.
COUPLING (coupling.rs). Staggered and Aitken-relaxed subiteration. The
decisive tests reproduce the added-mass effect: at a gain of 2.5 the
fixed-relaxation scheme DIVERGES and is reported as CouplingDiverged
rather than as an exhausted budget, and Aitken recovers the same case. A
partitioned coupling that cannot reproduce its own classic failure mode is
not being tested hard enough. Aitken is exact for a linear fixed point, so
convergence is asserted at <=4 iterations -- pinning that this is the real
delta-squared formula and not an under-relaxation that happens to work.
SCOPE, stated up front in the crate docs: small-displacement transpiration
coupling on a fixed mesh. Deliberately not ALE and not embedded-boundary,
so the Discrete Geometric Conservation Law does not yet apply -- the mesh
does not move. Large motion needs an embedded boundary treatment; that is
the next phase, not an oversight.
External comparator named at entry: Turek-Hron FSI2/FSI3, not yet reached.
26 tests written red-first; cargo test/fmt/clippy -D warnings clean.
Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
- jepa_gpu: remove the bring-up 2-block cap; full-depth GPU-resident
ViT verified against a full-depth CPU reference on the RTX 5060 Ti
(depth-12 ViT-Tiny max_rel_err <= 6.6e-5). CpuViTEncoder's own hidden
min(depth,2) cap removed too — CPU-path callers now get the model
they configured.
- jepa_distributed: real TCP parameter-server AllReduce backend
(rendezvous handshake with world-size/rank validation, length-
prefixed f32 payloads, connect/read/accept timeouts, connect retry
until deadline so early peers survive rank 0 still computing);
jepa_runner wires it for world_size > 1 and fails hard on collective
errors. Two-rank loopback training run covered by test.
- rtx-jepa-cli (new crate): rtx-jepa binary with train/bench/plan/
validate subcommands driving JepaRunConfig, run_jepa_training,
run_jepa_benchmark, and ClusterTrainingPlan (plan --emit-config
round-trips through a config serializer). GPU bench on this node:
86k patches/sec vs 1.3k CPU (~64x).
- ViTSizeStr::Micro (d=32, depth=2) added as an explicit test/smoke
size now that no hidden caps keep full-size configs cheap; heavy
tests moved onto it (rtx-transformers suite: 367s -> 5s, and the
runner subset had ballooned to 35min at full depth before this).
966 lib tests pass; 35/35 jepa_gpu with cuda; 8/8 CLI tests.
Co-Authored-By: Claude Fable 5 <[email protected]>
candle-kernels 0.9.2/0.8.4's compatibility.cuh has a buggy CUDA-version
guard ((MAJOR<12 || MINOR<2) && ARCH<750) that misfires on CUDA 13.1,
redefining __hmax_nan/__hmin_nan/atomicAdd that 13.1 already provides
natively. Fixed upstream in candle-kernels 0.11.0 (pure ARCH<800 gate),
so bump the workspace-wide candle pin to pull it in.
rtx-csm stays on candle 0.9.1 directly (not the workspace pin) since it
shares Tensor types with moshi 0.6.4, which itself pins candle-core
0.9.1 - both candle trees now build cleanly side by side.
Also fixes two latent compile issues surfaced by actually building the
cuda feature: DType is #[non_exhaustive] with new I16/I32/float8
variants (rtx-candle), and a missing HashMap import gated behind the
candle feature (rtx-inference).
Co-Authored-By: Claude Sonnet 5 <[email protected]>
arm/mod.rs used simd_minimum_number_nsz/simd_maximum_number_nsz intrinsics absent
on nightly-2025-10-25; swapped for simd_fmin/simd_fmax (same NaN semantics).
Pulled via criterion->plotters->font-kit. x86 path unaffected.
Co-Authored-By: Claude Opus 4.8 <[email protected]>