void testSolveArbitrary() { static Random::Uniform uniform(2.0, 7.0); static Random::Gaussian random(0.0, 100.0); // Test random polynomials of various degrees with real coefficients. Vector realCoeff; Vector_<Complex> roots; for (int i = 0; i < 1000; ++i) { int length = uniform.getIntValue(); realCoeff.resize(length); roots.resize(length-1); for (int j = 0; j < length; ++j) realCoeff[j] = random.getValue(); PolynomialRootFinder::findRoots(realCoeff, roots); verifyRoots(realCoeff, roots); } // Test random polynomials of various degrees with complex coefficients. Vector_<Complex> complexCoeff; for (int i = 0; i < 1000; ++i) { int length = uniform.getIntValue(); complexCoeff.resize(length); roots.resize(length-1); for (int j = 0; j < length; ++j) complexCoeff[j] = Complex(random.getValue(), random.getValue()); PolynomialRootFinder::findRoots(complexCoeff, roots); verifyRoots(complexCoeff, roots); } // Verify that if the leading coefficient is zero, it throws an exception. try { realCoeff[0] = 0.0; PolynomialRootFinder::findRoots(realCoeff, roots); ASSERT(false) } catch (const PolynomialRootFinder::ZeroLeadingCoefficient&) { } try { complexCoeff[0] = 0.0; PolynomialRootFinder::findRoots(complexCoeff, roots); ASSERT(false) } catch (const PolynomialRootFinder::ZeroLeadingCoefficient&) { } }
void Force::calcForceContribution(const State& state, Vector_<SpatialVec>& bodyForces, Vector_<Vec3>& particleForces, Vector& mobilityForces) const { const MultibodySystem& mbs = getForceSubsystem().getMultibodySystem(); const SimbodyMatterSubsystem& matter = mbs.getMatterSubsystem(); // Resize if necessary. bodyForces.resize(matter.getNumBodies()); particleForces.resize(matter.getNumParticles()); mobilityForces.resize(matter.getNumMobilities()); // Set all forces to zero. bodyForces.setToZero(); particleForces.setToZero(); mobilityForces.setToZero(); if (isDisabled(state)) return; // Add in force element contributions. getImpl().calcForce(state,bodyForces,particleForces,mobilityForces); }