|
FhSim
3.1.0
Marine systems simulation
|
| ID | 0059 |
| Class | BUG |
| Severity | 2 |
| Status | blocked |
Models: —
Found: 2026-10-21
Source: found while fixing FHSIM-0058 (feature fhsim-0058-mixed-blocks); that fix left it out of scope.
Decision needed: owner to rule. Options below; each moves the CSR and block-tridiagonal Jacobian of an affected model.
A diagonal block is mixed when the object's own OdeJacobian (analytical) and a non-analytical SelfPortCouplingLink both feed it (JacobianAssembler::GetMixedOwnershipBlocks, src/engine/model/JacobianAssembler.cpp, the loop over SelfPortCouplingLinks() at :329).
leaveToNumericalPass skips the object's OdeJacobian for that block (:414), so the whole-model finite difference supplies the total D + L (D the own block, L the loop).OdeJacobian (D). Section 3 skips every non-analytical self-coupling (:676-679). L is never added.:857-860).For such an object the dense block is D + L and the CSR and block-tridiagonal blocks are D. The loop's share is missing.
Reachability: not from normal solver selection. The CSR and block-tridiagonal passes need a pattern from JacobianSparsityAnalyzer::GetJacobianSparsity, which returns -1 for any model with a non-analytical port link or self link (JacobianSparsityAnalyzer.cpp:99, :127), so such a model gets the dense solver. Only a caller that hands its own pattern or block layout reaches it. None is known in-tree; no downstream repo calls these passes.
OdeJacobian.JacobianFillPathDifferences.DISABLED_MixedDiagonalBlock_PathsAgree asserts CSR and block-tridiagonal equal dense and is red. MixedDiagonalBlock_DenseIsTheTotalAndTheOtherPassesLoseTheLoop pins today's blocks (green). Both in tests/model/JacobianFillPathDifferences_test.cpp.
Moves the Jacobian of any model that reaches those passes with a mixed diagonal block. None is known in-tree.