7 #include "imstkPbdSolver.h" 8 #include "imstkLogger.h" 9 #include "imstkParallelUtils.h" 10 #include "imstkPbdCollisionConstraint.h" 11 #include "imstkPbdConstraintContainer.h" 15 PbdSolver::PbdSolver() :
16 m_constraints(
std::make_shared<PbdConstraintContainer>()),
17 m_constraintLists(
std::make_shared<
std::list<
std::vector<PbdConstraint*>*>>())
26 m_dataTracker->getStopWatch(DataTracker::ePhysics::SolverTime_ms).start();
29 size_t numConstraints = 0;
30 const std::vector<std::shared_ptr<PbdConstraint>>& constraints = m_constraints->getConstraints();
31 const std::vector<std::vector<std::shared_ptr<PbdConstraint>>>& partitionedConstraints = m_constraints->getPartitionedConstraints();
33 double averageC = 0.0;
34 double averageLambda = 0.0;
35 numConstraints += constraints.size();
37 for (
const auto& constraint : constraints)
39 constraint->zeroOutLambda();
43 for (
const auto& constraintPartition : partitionedConstraints)
45 numConstraints += constraints.size();
46 ParallelUtils::parallelFor(constraintPartition.size(),
49 constraintPartition[idx]->zeroOutLambda();
54 for (
auto constraintList : *m_constraintLists)
56 const std::vector<PbdConstraint*>& constraintVec = *constraintList;
57 numConstraints += constraintVec.size();
58 for (
size_t j = 0; j < constraintVec.size(); j++)
60 constraintVec[j]->zeroOutLambda();
65 while (i++ < m_iterations)
68 for (
auto constraintList : *m_constraintLists)
70 const std::vector<PbdConstraint*>& constraintVec = *constraintList;
71 for (
size_t j = 0; j < constraintVec.size(); j++)
73 constraintVec[j]->projectConstraint(*m_state, m_dt, m_solverType);
78 for (
const auto& constraint : constraints)
80 constraint->projectConstraint(*m_state, m_dt, m_solverType);
83 for (
const auto& constraintPartition : partitionedConstraints)
85 ParallelUtils::parallelFor(constraintPartition.size(),
88 constraintPartition[idx]->projectConstraint(*m_state, m_dt, m_solverType);
100 m_dataTracker->probeElapsedTime_s(DataTracker::ePhysics::SolverTime_ms);
101 m_dataTracker->probe(DataTracker::ePhysics::NumConstraints, numConstraints);
103 for (
const auto& constraint : constraints)
105 averageC += constraint->getConstraintC();
106 averageLambda += constraint->getLambda();
109 for (
const auto& constraintPartition : partitionedConstraints)
111 for (
size_t k = 0; k < constraintPartition.size(); k++)
113 averageC += constraintPartition[k]->getConstraintC();
114 averageLambda += constraintPartition[k]->getLambda();
118 for (
auto constraintList : *m_constraintLists)
120 const std::vector<PbdConstraint*>& constraintVec = *constraintList;
121 for (
size_t j = 0; j < constraintVec.size(); j++)
123 averageC += constraintVec[j]->getConstraintC();
124 averageLambda += constraintVec[j]->getLambda();
128 averageC /= numConstraints;
129 m_dataTracker->probe(DataTracker::ePhysics::AverageC, averageC);