void TimeStepController::constraintProjection(SimulationModel &model) { const unsigned int maxIter = 5; unsigned int iter = 0; // init constraint groups if necessary model.initConstraintGroups(); SimulationModel::RigidBodyVector &rb = model.getRigidBodies(); SimulationModel::ConstraintVector &constraints = model.getConstraints(); SimulationModel::ConstraintGroupVector &groups = model.getConstraintGroups(); while (iter < maxIter) { for (unsigned int group = 0; group < groups.size(); group++) { #pragma omp parallel default(shared) { #pragma omp for schedule(static) for (int i = 0; i < (int)groups[group].size(); i++) { const unsigned int constraintIndex = groups[group][i]; constraints[constraintIndex]->updateConstraint(model); constraints[constraintIndex]->solveConstraint(model); } } } iter++; } }
void TimeStepController::velocityConstraintProjection(SimulationModel &model) { unsigned int iter = 0; // init constraint groups if necessary model.initConstraintGroups(); SimulationModel::RigidBodyVector &rb = model.getRigidBodies(); SimulationModel::ConstraintVector &constraints = model.getConstraints(); SimulationModel::ConstraintGroupVector &groups = model.getConstraintGroups(); SimulationModel::RigidBodyContactConstraintVector &rigidBodyContacts = model.getRigidBodyContactConstraints(); SimulationModel::ParticleRigidBodyContactConstraintVector &particleRigidBodyContacts = model.getParticleRigidBodyContactConstraints(); for (unsigned int group = 0; group < groups.size(); group++) { const int groupSize = (int)groups[group].size(); #pragma omp parallel if(groupSize > MIN_PARALLEL_SIZE) default(shared) { #pragma omp for schedule(static) for (int i = 0; i < groupSize; i++) { const unsigned int constraintIndex = groups[group][i]; constraints[constraintIndex]->updateConstraint(model); } } } while (iter < m_maxIterVel) { for (unsigned int group = 0; group < groups.size(); group++) { const int groupSize = (int)groups[group].size(); #pragma omp parallel if(groupSize > MIN_PARALLEL_SIZE) default(shared) { #pragma omp for schedule(static) for (int i = 0; i < groupSize; i++) { const unsigned int constraintIndex = groups[group][i]; constraints[constraintIndex]->solveVelocityConstraint(model); } } } // solve contacts for (unsigned int i = 0; i < rigidBodyContacts.size(); i++) rigidBodyContacts[i].solveVelocityConstraint(model); for (unsigned int i = 0; i < particleRigidBodyContacts.size(); i++) particleRigidBodyContacts[i].solveVelocityConstraint(model); iter++; } }