| 73 | } |
| 74 | |
| 75 | void TimeStepController::step(SimulationModel &model) |
| 76 | { |
| 77 | START_TIMING("simulation step"); |
| 78 | TimeManager *tm = TimeManager::getCurrent (); |
| 79 | const Real hOld = tm->getTimeStepSize(); |
| 80 | |
| 81 | ////////////////////////////////////////////////////////////////////////// |
| 82 | // rigid body model |
| 83 | ////////////////////////////////////////////////////////////////////////// |
| 84 | clearAccelerations(model); |
| 85 | SimulationModel::RigidBodyVector &rb = model.getRigidBodies(); |
| 86 | ParticleData &pd = model.getParticles(); |
| 87 | OrientationData &od = model.getOrientations(); |
| 88 | |
| 89 | const int numBodies = (int)rb.size(); |
| 90 | |
| 91 | Real h = hOld / (Real)m_subSteps; |
| 92 | tm->setTimeStepSize(h); |
| 93 | for (unsigned int step = 0; step < m_subSteps; step++) |
| 94 | { |
| 95 | #pragma omp parallel if(numBodies > MIN_PARALLEL_SIZE) default(shared) |
| 96 | { |
| 97 | #pragma omp for schedule(static) nowait |
| 98 | for (int i = 0; i < numBodies; i++) |
| 99 | { |
| 100 | rb[i]->getLastPosition() = rb[i]->getOldPosition(); |
| 101 | rb[i]->getOldPosition() = rb[i]->getPosition(); |
| 102 | TimeIntegration::semiImplicitEuler(h, rb[i]->getMass(), rb[i]->getPosition(), rb[i]->getVelocity(), rb[i]->getAcceleration()); |
| 103 | rb[i]->getLastRotation() = rb[i]->getOldRotation(); |
| 104 | rb[i]->getOldRotation() = rb[i]->getRotation(); |
| 105 | TimeIntegration::semiImplicitEulerRotation(h, rb[i]->getMass(), rb[i]->getInertiaTensorW(), rb[i]->getInertiaTensorInverseW(), rb[i]->getRotation(), rb[i]->getAngularVelocity(), rb[i]->getTorque()); |
| 106 | rb[i]->rotationUpdated(); |
| 107 | } |
| 108 | |
| 109 | ////////////////////////////////////////////////////////////////////////// |
| 110 | // particle model |
| 111 | ////////////////////////////////////////////////////////////////////////// |
| 112 | #pragma omp for schedule(static) |
| 113 | for (int i = 0; i < (int) pd.size(); i++) |
| 114 | { |
| 115 | pd.getLastPosition(i) = pd.getOldPosition(i); |
| 116 | pd.getOldPosition(i) = pd.getPosition(i); |
| 117 | TimeIntegration::semiImplicitEuler(h, pd.getMass(i), pd.getPosition(i), pd.getVelocity(i), pd.getAcceleration(i)); |
| 118 | } |
| 119 | |
| 120 | ////////////////////////////////////////////////////////////////////////// |
| 121 | // orientation model |
| 122 | ////////////////////////////////////////////////////////////////////////// |
| 123 | #pragma omp for schedule(static) |
| 124 | for (int i = 0; i < (int)od.size(); i++) |
| 125 | { |
| 126 | od.getLastQuaternion(i) = od.getOldQuaternion(i); |
| 127 | od.getOldQuaternion(i) = od.getQuaternion(i); |
| 128 | TimeIntegration::semiImplicitEulerRotation(h, od.getMass(i), od.getMass(i) * Matrix3r::Identity(), od.getInvMass(i) * Matrix3r::Identity(),od.getQuaternion(i), od.getVelocity(i), Vector3r(0,0,0)); |
| 129 | } |
| 130 | } |
| 131 | |
| 132 | START_TIMING("position constraints projection"); |
nothing calls this directly
no test coverage detected