MCPcopy Create free account
hub / github.com/InteractiveComputerGraphics/PositionBasedDynamics / step

Method step

Simulation/TimeStepController.cpp:75–241  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

73}
74
75void 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");

Callers

nothing calls this directly

Calls 12

getTimeStepSizeMethod · 0.80
setTimeStepSizeMethod · 0.80
getMassMethod · 0.80
getRotationMethod · 0.80
rotationUpdatedMethod · 0.80
collisionDetectionMethod · 0.80
getTimeMethod · 0.80
getRepeatSequenceMethod · 0.80
setTimeMethod · 0.80
sizeMethod · 0.45
setTargetMethod · 0.45

Tested by

no test coverage detected