Kamino#

SolverKamino simulates constrained rigid multi-body systems in maximal coordinates. It is designed for mechanical assemblies with kinematic loops, under- or overactuation, joint limits, hard frictional contacts, and restitutive impacts.

Unlike the other maximal-coordinate solvers, Kamino focuses on constrained rigid mechanical assemblies rather than particle or deformable simulation. Kamino is currently in BETA 1, and Newton users are discouraged from depending on it. Evaluate it only when kinematic loops and hard contact constraints are primary requirements and an experimental solver is acceptable.

Experimental

SolverKamino is experimental. Its public API, behavior, feature support, performance, and implementation may change without prior notice.

See the SolverKamino API reference for construction and configuration details. Runnable workflows are available in the Kamino examples.

Choosing a dynamics solver#

Kamino provides two forward-dynamics backends:

  • "padmm" (default): proximal ADMM, dense Jacobians/dynamics, and the Euler integrator. It is the slower, more robust option because it solves equality and inequality constraints together.

  • "dvi" (opt-in): projected dual iterations, sparse Jacobians, dense dynamics with the RCM-reordered blocked LLT solver, and the Euler integrator. It is generally faster, but approximates the coupled problem by alternating between a direct solve for equality constraints and projected iterations for inequality constraints. As a rule of thumb, DVI solves inequality constraints less accurately than PADMM, particularly as the number of active inequalities grows. Dual preconditioning is not supported.

Select the backend when constructing the configuration so dependent defaults initialize consistently:

config = newton.solvers.SolverKamino.Config(dynamics_solver="dvi")
solver = newton.solvers.SolverKamino(model, config=config)

DVI is best suited to performance-sensitive rigid mechanisms with relatively few active contacts; PADMM remains the safer and more broadly validated choice. Set sparse_jacobian=False for fully dense DVI, or set sparse_dynamics=True to use sparse dynamics with the Conjugate Residual solver. With collect_solver_info=True, DVI stores terminal residual status that should not be interpreted as PADMM ADMM residuals.

For large bilateral systems, opt into RCM-reordered factorization explicitly:

config.dvi.bilateral_solver_type = "LLTBRCM"
config.dvi.bilateral_solver_kwargs = {
    "block_size": 32,
    "reuse_permutation": True,
    "parallel_factorization": True,
}

The cached permutation remains mathematically valid when matrix values or sparsity change and is recomputed automatically if the active dimension changes. Keep the default "LLTB" solver for small systems.