Update regression due to PR6256 (MatrixProjectionMethod fix) - #126
Open
fredroy wants to merge 1 commit into
Open
Update regression due to PR6256 (MatrixProjectionMethod fix)#126fredroy wants to merge 1 commit into
fredroy wants to merge 1 commit into
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
for
Why, by Claude:
That randomly-named node is a contact node created at runtime by the penalty collision response, and its size (3, 6, 12, 18, 24) is 3 × the number of active contacts. It's the mapper on the Floor side — and the Floor is
simulated="0" moving="0", so it lives outside the solver's subtree, isn't in the mapping graph, andgetTopMostMechanicalStates()returns an empty set for it (n1=0).MappingGraph::buildonly indexes states gathered from the solver's root node, sofindStateNodereturns null.So for
K(floorContact, beamCollision):inputs = ∅ ∪ {beamDOFs} = {beamDOFs}, giving the pair(beamDOFs, beamDOFs). With J0 null,computeProjectionfell back to the unprojectedK * J1— a 3×48 block — and wrote it at (0,0) of the 48×48 beam matrix. Note the dimensions: 3 rows placed against a state of size 48. It was silently polluting rows/columns 0..2 of the beam's stiffness (DOF 0 being the fixed node), every step there was a contact.inputs1 × inputs2 = ∅ × {beamDOFs} = ∅→ the block is dropped, which is right. Those rows are DOFs of a static object; they aren't unknowns in the system.The dimensional mismatch is the proof: every dropped block has
rows ≠ |a|orcols ≠ |b|; every retained block matches exactly. And the physically meaningful contact term survives —K=(Collision/MechanicalObject1 24, Collision/MechanicalObject1 24)→ 48×48 at (0,0),inProduct=1is still assembled (67 and 64 hits). For a penalty contact against a fixed obstacle, only that diagonal block belongs in the matrix anyway.What it means
The fix is correct; the reference is stale. It was recorded with the spurious contribution, so removing it legitimately shifts the trajectory — by a small amount, consistent with
ERRORBYDOF: 0.0066.