void SymplecticEulerMap::flow( const VectorXs& q0, const VectorXs& v0, FlowableSystem& fsys, const unsigned iteration, const scalar& dt, VectorXs& q1, VectorXs& v1 ) { assert( iteration > 0 ); const scalar start_time{ ( iteration - 1 ) * dt }; // Use q1 as temporary storage for the force fsys.computeForce( q0, v0, start_time, q1 ); // Zero the force for fixed bodies const unsigned nbodies{ fsys.numBodies() }; for( unsigned bdy_idx = 0; bdy_idx < nbodies; ++bdy_idx ) { if( fsys.isKinematicallyScripted( bdy_idx ) ) { q1.segment<3>( 3 * bdy_idx ).setZero(); } } // Velocity update v1 = v0 + dt * fsys.Minv() * q1; // Position update q1 = q0 + dt * v1; }