/** * @brief Create the physical model * * @param m Mass of the particle * @param s Stiffness of the spring * @param d Damping ratio of the spring * @param xx0 initial position * @param vv0 initial velocity */ void setup( SReal m, SReal s, SReal d, SReal xx0, SReal vv0 ) { mass = m; stiffness = s; damping = d; x0=xx0; v0=vv0; node = clearScene(); node->setGravity( Vec3(0,0,0) ); // The oscillator simulation::Node::SPtr oscillator = node->createChild("oscillator"); DOF = addNew<MechanicalObject1>(oscillator,"DOF"); DOF->resize(1); DOF->writePositions()[0] = Vec1(x0); DOF->writeVelocities()[0] = Vec1(v0); UniformMass1::SPtr Mass = addNew<UniformMass1>(oscillator,"mass"); Mass->mass.setValue( mass ); compliance = addNew<UniformCompliance1>(oscillator,"compliance"); compliance->isCompliance.setValue(false); compliance->compliance.setValue(1.0/stiffness); compliance->damping.setValue(damping); }
/// Create the context for the scene void createScene(double K, double m, double l0, double rm=0, double rk=0) { // Init simulation sofa::simulation::setSimulation(simulation = new sofa::simulation::graph::DAGSimulation()); root = simulation::getSimulation()->createNewGraph("root"); // Create the scene root->setGravity(Coord(0,-10,0)); // Solver variationalSolver = addNew<VariationalSymplecticSolver> (getRoot()); variationalSolver->f_rayleighStiffness.setValue(rk); variationalSolver->f_rayleighMass.setValue(rm); variationalSolver->f_computeHamiltonian.setValue(1); variationalSolver->f_newtonError.setValue(1e-12);//1e-18 variationalSolver->f_newtonSteps.setValue(4);//7 CGLinearSolver::SPtr cgLinearSolver = addNew<CGLinearSolver> (getRoot()); cgLinearSolver->f_maxIter=3000; cgLinearSolver->f_tolerance =1e-12; cgLinearSolver->f_smallDenominatorThreshold=1e-12; // Set initial positions and velocities of fixed point and mass MechanicalObject3::VecCoord xFixed(1); MechanicalObject3::DataTypes::set( xFixed[0], 0., 2.,0.); MechanicalObject3::VecDeriv vFixed(1); MechanicalObject3::DataTypes::set( vFixed[0], 0.,0.,0.); MechanicalObject3::VecCoord xMass(1); MechanicalObject3::DataTypes::set( xMass[0], 0., 1.,0.); MechanicalObject3::VecDeriv vMass(1); MechanicalObject3::DataTypes::set( vMass[0], 0., 0., 0.); // Mass spring system root = this-> createMassSpringSystem( root, // add mass spring system to the node containing solver K, // stiffness m, // mass l0, // spring rest length xFixed, // Initial position of fixed point vFixed, // Initial velocity of fixed point xMass, // Initial position of mass vMass); // Initial velocity of mass }