diff --git a/Examples/PBD/PBDCloth/pbdClothExample.cpp b/Examples/PBD/PBDCloth/pbdClothExample.cpp index 4103f8855d3f63dbd7156e29990fa4c9722328ce..bfbcc57d17e1dc1521cc5f8dc9bc7043584041e5 100644 --- a/Examples/PBD/PBDCloth/pbdClothExample.cpp +++ b/Examples/PBD/PBDCloth/pbdClothExample.cpp @@ -104,7 +104,7 @@ main() // pbdParams->m_solverType = PbdConstraint::SolverType::PBD; pbdParams->enableConstraint(PbdConstraint::Type::Distance, 1e2); pbdParams->enableConstraint(PbdConstraint::Type::Dihedral, 1e1); - std::vector<size_t> fixedNodes = {0, nCols-1}; + std::vector<size_t> fixedNodes = { 0, nCols - 1 }; pbdParams->m_fixedNodeIds = fixedNodes; // Other parameters diff --git a/Examples/PBD/PBDString/pbdStringExample.cpp b/Examples/PBD/PBDString/pbdStringExample.cpp index 280995dd0ba2ba6d46f4be66d3bc1947c43ec0be..a6b8e2b8a7d1e846c6dd0a94d3daeb8a52c2fd11 100644 --- a/Examples/PBD/PBDString/pbdStringExample.cpp +++ b/Examples/PBD/PBDString/pbdStringExample.cpp @@ -92,7 +92,7 @@ main() // Configure the parameters with bend stiffnesses varying from 0.001 to ~0.1 sims[i].params = std::make_shared<PBDModelConfig>(); sims[i].params->enableConstraint(PbdConstraint::Type::Distance, 1e7); - sims[i].params->enableConstraint(PbdConstraint::Type::Bend, (static_cast<double>(i) * 0.1 / numStrings + 0.001)*1e6); + sims[i].params->enableConstraint(PbdConstraint::Type::Bend, (static_cast<double>(i) * 0.1 / numStrings + 0.001) * 1e6); sims[i].params->m_fixedNodeIds = { 0 }; sims[i].params->m_uniformMassValue = 5.0; sims[i].params->m_gravity = Vec3d(0, -9.8, 0); diff --git a/Source/Constraint/PbdConstraints/imstkPbdAreaConstraint.cpp b/Source/Constraint/PbdConstraints/imstkPbdAreaConstraint.cpp index 6fb73476d848b707d2559ff20be030b37231b616..6121b15e54634b7d15e52f26976341c327a21ed0 100644 --- a/Source/Constraint/PbdConstraints/imstkPbdAreaConstraint.cpp +++ b/Source/Constraint/PbdConstraints/imstkPbdAreaConstraint.cpp @@ -34,7 +34,7 @@ PbdAreaConstraint::initConstraint(const StdVectorOfVec3d& initVertexPositions, m_vertexIds[1] = pIdx1; m_vertexIds[2] = pIdx2; - this->m_stiffness = k; + this->m_stiffness = k; this->m_compliance = 1.0 / k; const Vec3d& p0 = initVertexPositions[pIdx0]; @@ -62,9 +62,12 @@ PbdAreaConstraint::computeValueAndGradient(const StdVectorOfVec3d& currVertexPos const Vec3d e2 = p2 - p0; Vec3d n = e0.cross(e1); - c = 0.5 * n.norm(); + c = 0.5 * n.norm(); - if (c < m_epsilon) return false; + if (c < m_epsilon) + { + return false; + } n /= 2 * c; c -= m_restArea; diff --git a/Source/Constraint/PbdConstraints/imstkPbdAreaConstraint.h b/Source/Constraint/PbdConstraints/imstkPbdAreaConstraint.h index 303643d68016c6cb7040b6e4041c2f1bc42cfd4e..0135fe574b3849b46d1e47ee1cd982b4cf252e32 100644 --- a/Source/Constraint/PbdConstraints/imstkPbdAreaConstraint.h +++ b/Source/Constraint/PbdConstraints/imstkPbdAreaConstraint.h @@ -52,10 +52,10 @@ public: const double k = 2.5); bool computeValueAndGradient(const StdVectorOfVec3d& currVertexPositions, - double& c, - StdVectorOfVec3d& dcdx) const override; + double& c, + StdVectorOfVec3d& dcdx) const override; public: - double m_restArea = 0.; ///> Area at the rest position + double m_restArea = 0.; ///> Area at the rest position }; } // imstk diff --git a/Source/Constraint/PbdConstraints/imstkPbdBendConstraint.cpp b/Source/Constraint/PbdConstraints/imstkPbdBendConstraint.cpp index d4812e18ee995051c3faf07e89f3ce5d3063091c..9bb0315a17ef4617bd539746ca0feeda88b6947f 100644 --- a/Source/Constraint/PbdConstraints/imstkPbdBendConstraint.cpp +++ b/Source/Constraint/PbdConstraints/imstkPbdBendConstraint.cpp @@ -24,17 +24,17 @@ namespace imstk { void - PbdBendConstraint::initConstraint(const StdVectorOfVec3d& initVertexPositions, - const size_t& pIdx0, - const size_t& pIdx1, - const size_t& pIdx2, - const double k) +PbdBendConstraint::initConstraint(const StdVectorOfVec3d& initVertexPositions, + const size_t& pIdx0, + const size_t& pIdx1, + const size_t& pIdx2, + const double k) { m_vertexIds[0] = pIdx0; m_vertexIds[1] = pIdx1; m_vertexIds[2] = pIdx2; - m_stiffness = k; + m_stiffness = k; m_compliance = 1.0 / k; const Vec3d& p0 = initVertexPositions[pIdx0]; @@ -49,8 +49,8 @@ void bool PbdBendConstraint::computeValueAndGradient(const StdVectorOfVec3d& currVertexPositions, - double& c, - StdVectorOfVec3d& dcdx) const + double& c, + StdVectorOfVec3d& dcdx) const { const size_t i0 = m_vertexIds[0]; const size_t i1 = m_vertexIds[1]; @@ -65,7 +65,7 @@ PbdBendConstraint::computeValueAndGradient(const StdVectorOfVec3d& currVertexPos const Vec3d& diff = p1 - center; const double dist = diff.norm(); - if (dist < m_epsilon) + if (dist < m_epsilon) { return false; } @@ -79,5 +79,4 @@ PbdBendConstraint::computeValueAndGradient(const StdVectorOfVec3d& currVertexPos return true; } - } // imstk diff --git a/Source/Constraint/PbdConstraints/imstkPbdBendConstraint.h b/Source/Constraint/PbdConstraints/imstkPbdBendConstraint.h index 98c536a5873b6cf45c81958e6cf24f242da0d60f..c2e68dc2f8702512a4f14127834fe361994831f2 100644 --- a/Source/Constraint/PbdConstraints/imstkPbdBendConstraint.h +++ b/Source/Constraint/PbdConstraints/imstkPbdBendConstraint.h @@ -67,8 +67,8 @@ public: /// \brief Compute the value and gradient of constraint /// bool computeValueAndGradient(const StdVectorOfVec3d& currVertexPosition, - double& c, - StdVectorOfVec3d& dcdx) const override; + double& c, + StdVectorOfVec3d& dcdx) const override; public: double m_restLength = 0.; ///> Rest length }; diff --git a/Source/Constraint/PbdConstraints/imstkPbdCollisionConstraint.cpp b/Source/Constraint/PbdConstraints/imstkPbdCollisionConstraint.cpp index 9cd0fd6ffb23e9874b032464977a9e1208f3c4db..dda274ce9101a8d8b14404fd0ee0bd6062378fa5 100644 --- a/Source/Constraint/PbdConstraints/imstkPbdCollisionConstraint.cpp +++ b/Source/Constraint/PbdConstraints/imstkPbdCollisionConstraint.cpp @@ -30,34 +30,37 @@ PbdCollisionConstraint::PbdCollisionConstraint(const unsigned int& n1, const uns m_bodiesSecond.resize(n2); } - -void PbdCollisionConstraint::projectConstraint(const StdVectorOfReal& invMassA, - const StdVectorOfReal& invMassB, - StdVectorOfVec3d& posA, - StdVectorOfVec3d& posB) +void +PbdCollisionConstraint::projectConstraint(const StdVectorOfReal& invMassA, + const StdVectorOfReal& invMassB, + StdVectorOfVec3d& posA, + StdVectorOfVec3d& posB) { - double c; + double c; StdVectorOfVec3d dcdxA; StdVectorOfVec3d dcdxB; bool update = this->computeValueAndGradient(posA, posB, c, dcdxA, dcdxB); - if (!update) return; + if (!update) + { + return; + } double lambda = 0.0; - for (size_t i=0; i<m_bodiesFirst.size(); ++i) + for (size_t i = 0; i < m_bodiesFirst.size(); ++i) { lambda += invMassA[m_bodiesFirst[i]] * dcdxA[i].squaredNorm(); } - for (size_t i=0; i<m_bodiesSecond.size(); ++i) + for (size_t i = 0; i < m_bodiesSecond.size(); ++i) { lambda += invMassB[m_bodiesSecond[i]] * dcdxB[i].squaredNorm(); } lambda = c / lambda; - for (size_t i=0, vid=0; i<m_bodiesFirst.size(); ++i) + for (size_t i = 0, vid = 0; i < m_bodiesFirst.size(); ++i) { vid = m_bodiesFirst[i]; if (invMassA[vid] > 0.0) @@ -66,7 +69,7 @@ void PbdCollisionConstraint::projectConstraint(const StdVectorOfReal& invMassA, } } - for (size_t i=0, vid=0; i<m_bodiesSecond.size(); ++i) + for (size_t i = 0, vid = 0; i < m_bodiesSecond.size(); ++i) { vid = m_bodiesSecond[i]; if (invMassB[vid] > 0.0) diff --git a/Source/Constraint/PbdConstraints/imstkPbdCollisionConstraint.h b/Source/Constraint/PbdConstraints/imstkPbdCollisionConstraint.h index 48bc64f3cdad69a2bb3369cf1bc7d512c9bb58b5..bd5270f7224acfaa8362fa49001b2e5bac916a5a 100644 --- a/Source/Constraint/PbdConstraints/imstkPbdCollisionConstraint.h +++ b/Source/Constraint/PbdConstraints/imstkPbdCollisionConstraint.h @@ -70,12 +70,12 @@ public: /// /// \brief Get config /// - const PbdCollisionConstraintConfig& getConfigFirst() const {return *m_configA;} - const PbdCollisionConstraintConfig& getConfigSecond() const {return *m_configB;} + const PbdCollisionConstraintConfig& getConfigFirst() const { return *m_configA; } + const PbdCollisionConstraintConfig& getConfigSecond() const { return *m_configB; } /// /// \brief compute value and gradient of constraint function - /// + /// /// \param[in] currVertexPositionsA current positions from object A /// \param[in] currVertexPositionsA current positions from object B /// \param[inout] c constraint value @@ -83,14 +83,14 @@ public: /// virtual bool computeValueAndGradient(const StdVectorOfVec3d& posA, const StdVectorOfVec3d& posB, - double& c, - StdVectorOfVec3d& dcdxA, - StdVectorOfVec3d& dcdxB) const = 0; + double& c, + StdVectorOfVec3d& dcdxA, + StdVectorOfVec3d& dcdxB) const = 0; - virtual void projectConstraint(const StdVectorOfReal& invMassA, + virtual void projectConstraint(const StdVectorOfReal& invMassA, const StdVectorOfReal& invMassB, - StdVectorOfVec3d& posA, - StdVectorOfVec3d& posB); + StdVectorOfVec3d& posA, + StdVectorOfVec3d& posB); protected: std::vector<size_t> m_bodiesFirst; ///> index of points for the first object std::vector<size_t> m_bodiesSecond; ///> index of points for the second object diff --git a/Source/Constraint/PbdConstraints/imstkPbdConstantDensityConstraint.cpp b/Source/Constraint/PbdConstraints/imstkPbdConstantDensityConstraint.cpp index e8dca06850d267252431be0fbb52f8ca500a0abe..03fe3fd841019825d024481ad38f58ffb441640d 100644 --- a/Source/Constraint/PbdConstraints/imstkPbdConstantDensityConstraint.cpp +++ b/Source/Constraint/PbdConstraints/imstkPbdConstantDensityConstraint.cpp @@ -45,10 +45,10 @@ PbdConstantDensityConstraint::initConstraint(const StdVectorOfVec3d& initVertexP } void -PbdConstantDensityConstraint::projectConstraint(const StdVectorOfReal& currInvMasses, - const double dt, +PbdConstantDensityConstraint::projectConstraint(const StdVectorOfReal& currInvMasses, + const double dt, const PbdConstraint::SolverType& type, - StdVectorOfVec3d& currVertexPositions) + StdVectorOfVec3d& currVertexPositions) { const size_t numParticles = currVertexPositions.size(); diff --git a/Source/Constraint/PbdConstraints/imstkPbdConstantDensityConstraint.h b/Source/Constraint/PbdConstraints/imstkPbdConstantDensityConstraint.h index 44057a36280ddff5388168ab9a46425038cac445..81f97b656f2a54f98b8c07ad9640af60e30f50e6 100644 --- a/Source/Constraint/PbdConstraints/imstkPbdConstantDensityConstraint.h +++ b/Source/Constraint/PbdConstraints/imstkPbdConstantDensityConstraint.h @@ -59,14 +59,14 @@ public: /// /// \brief Solves the constant density constraint /// - void projectConstraint(const StdVectorOfReal& currInvMasses, - const double dt, + void projectConstraint(const StdVectorOfReal& currInvMasses, + const double dt, const PbdConstraint::SolverType& type, - StdVectorOfVec3d& currVertexPositions) override; + StdVectorOfVec3d& currVertexPositions) override; bool computeValueAndGradient(const StdVectorOfVec3d& currVertexPositions, - double& c, - StdVectorOfVec3d& dcdx) const + double& c, + StdVectorOfVec3d& dcdx) const { return true; } diff --git a/Source/Constraint/PbdConstraints/imstkPbdConstraint.cpp b/Source/Constraint/PbdConstraints/imstkPbdConstraint.cpp index cb744539329442c798c7ec6f96d8d96b5f2cc070..443c2a17ad140350c8ed738534e314f6a40b1d09 100644 --- a/Source/Constraint/PbdConstraints/imstkPbdConstraint.cpp +++ b/Source/Constraint/PbdConstraints/imstkPbdConstraint.cpp @@ -1,21 +1,45 @@ +/*========================================================================= + + Library: iMSTK + + Copyright (c) Kitware, Inc. & Center for Modeling, Simulation, + & Imaging in Medicine, Rensselaer Polytechnic Institute. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0.txt + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +=========================================================================*/ + #include "imstkPbdConstraint.h" namespace imstk { - -void PbdConstraint::projectConstraint(const StdVectorOfReal& invMasses, const double dt, const SolverType& solverType, StdVectorOfVec3d& pos) +void +PbdConstraint::projectConstraint(const StdVectorOfReal& invMasses, const double dt, const SolverType& solverType, StdVectorOfVec3d& pos) { - double c; + double c; StdVectorOfVec3d dcdx; bool update = this->computeValueAndGradient(pos, c, dcdx); - if (!update) return; + if (!update) + { + return; + } double dcMidc = 0.0; double lambda = 0.0; double alpha; - for (size_t i=0; i<m_vertexIds.size(); ++i) + for (size_t i = 0; i < m_vertexIds.size(); ++i) { dcMidc += invMasses[m_vertexIds[i]] * dcdx[i].squaredNorm(); } @@ -28,20 +52,20 @@ void PbdConstraint::projectConstraint(const StdVectorOfReal& invMasses, const do switch (solverType) { case (SolverType::xPBD): - alpha = m_compliance / (dt * dt ); - lambda = -(c + alpha * m_lambda) / (dcMidc + alpha); + alpha = m_compliance / (dt * dt); + lambda = -(c + alpha * m_lambda) / (dcMidc + alpha); m_lambda += lambda; break; case (SolverType::PBD): lambda = -c * m_stiffness / dcMidc; break; default: - alpha = m_compliance / (dt * dt ); - lambda = -(c + alpha * m_lambda) / (dcMidc + alpha); + alpha = m_compliance / (dt * dt); + lambda = -(c + alpha * m_lambda) / (dcMidc + alpha); m_lambda += lambda; } - for (size_t i=0, vid=0; i<m_vertexIds.size(); ++i) + for (size_t i = 0, vid = 0; i < m_vertexIds.size(); ++i) { vid = m_vertexIds[i]; if (invMasses[vid] > 0.0) @@ -52,5 +76,4 @@ void PbdConstraint::projectConstraint(const StdVectorOfReal& invMasses, const do return; } - } diff --git a/Source/Constraint/PbdConstraints/imstkPbdConstraint.h b/Source/Constraint/PbdConstraints/imstkPbdConstraint.h index ffdc36ac0a1b8d48c7765ce3d04e46ada3c531f1..927fc9eeffc0e5e0172a29a619997a5fd97e0883 100644 --- a/Source/Constraint/PbdConstraints/imstkPbdConstraint.h +++ b/Source/Constraint/PbdConstraints/imstkPbdConstraint.h @@ -71,7 +71,7 @@ public: /// virtual Type getType() const = 0; - /// + /// /// \brief Compute value and gradient of the constraint /// /// \param[in] currVertexPositions vector of current positions @@ -79,8 +79,8 @@ public: /// \param[inout] dcdx constraint gradient /// virtual bool computeValueAndGradient(const StdVectorOfVec3d& currVertexPositions, - double& c, - StdVectorOfVec3d& dcdx) const = 0; + double& c, + StdVectorOfVec3d& dcdx) const = 0; /// /// \brief Get the vertex indices of the constraint @@ -100,9 +100,10 @@ public: /// /// \brief Set the stiffness /// - void setStiffness(const double stiffness) { - m_stiffness = stiffness; - m_compliance = 1.0 / stiffness; + void setStiffness(const double stiffness) + { + m_stiffness = stiffness; + m_compliance = 1.0 / stiffness; } /// @@ -111,7 +112,7 @@ public: double getStiffness() const { return m_stiffness; } /// - /// \brief Use PBD + /// \brief Use PBD /// void zeroOutLambda() { m_lambda = 0.0; } @@ -121,9 +122,9 @@ public: virtual void projectConstraint(const StdVectorOfReal& currInvMasses, const double dt, const SolverType& type, StdVectorOfVec3d& pos); protected: std::vector<size_t> m_vertexIds; ///> index of points for the constraint - double m_epsilon = 1.0e-16; ///> Tolerance used for the costraints - double m_stiffness = 1.0; ///> used in PBD, [0, 1] - double m_compliance = 1e-7; ///> used in xPBD, inverse of Young's Modulus + double m_epsilon = 1.0e-16; ///> Tolerance used for the costraints + double m_stiffness = 1.0; ///> used in PBD, [0, 1] + double m_compliance = 1e-7; ///> used in xPBD, inverse of Young's Modulus mutable double m_lambda = 0.0; ///> Lagrange multiplier }; diff --git a/Source/Constraint/PbdConstraints/imstkPbdDihedralConstraint.cpp b/Source/Constraint/PbdConstraints/imstkPbdDihedralConstraint.cpp index 5b961e489509d727b3237f4adaeb3d6aa2ad15f9..d45e2edd87341aa2e7d24fe589cef5e3411168b4 100644 --- a/Source/Constraint/PbdConstraints/imstkPbdDihedralConstraint.cpp +++ b/Source/Constraint/PbdConstraints/imstkPbdDihedralConstraint.cpp @@ -26,18 +26,18 @@ namespace imstk { void PbdDihedralConstraint::initConstraint(const StdVectorOfVec3d& initVertexPositions, - const size_t& pIdx0, - const size_t& pIdx1, - const size_t& pIdx2, - const size_t& pIdx3, - const double k) + const size_t& pIdx0, + const size_t& pIdx1, + const size_t& pIdx2, + const size_t& pIdx3, + const double k) { m_vertexIds[0] = pIdx0; m_vertexIds[1] = pIdx1; m_vertexIds[2] = pIdx2; m_vertexIds[3] = pIdx3; - m_stiffness = k; + m_stiffness = k; m_compliance = 1.0 / k; const Vec3d& p0 = initVertexPositions[pIdx0]; @@ -53,8 +53,8 @@ PbdDihedralConstraint::initConstraint(const StdVectorOfVec3d& initVertexPosition bool PbdDihedralConstraint::computeValueAndGradient(const StdVectorOfVec3d& currVertexPositions, - double& c, - StdVectorOfVec3d& dcdx) const + double& c, + StdVectorOfVec3d& dcdx) const { const auto i0 = m_vertexIds[0]; const auto i1 = m_vertexIds[1]; @@ -91,9 +91,8 @@ PbdDihedralConstraint::computeValueAndGradient(const StdVectorOfVec3d& currVerte dcdx[2] = (e.dot(e1) / (A1 * l)) * n1 + (e.dot(e3) / (A2 * l)) * n2; dcdx[3] = (e.dot(e2) / (A1 * l)) * n1 + (e.dot(e4) / (A2 * l)) * n2; - c = atan2(n1.cross(n2).dot(e), l * n1.dot(n2)) - m_restAngle; + c = atan2(n1.cross(n2).dot(e), l * n1.dot(n2)) - m_restAngle; return true; } } // imstk - diff --git a/Source/Constraint/PbdConstraints/imstkPbdDihedralConstraint.h b/Source/Constraint/PbdConstraints/imstkPbdDihedralConstraint.h index 5592ff0c3dc5d10b054da86b31ed9890d4f308cf..98ad174c203726cf03ff14263504481b79aa5ca4 100644 --- a/Source/Constraint/PbdConstraints/imstkPbdDihedralConstraint.h +++ b/Source/Constraint/PbdConstraints/imstkPbdDihedralConstraint.h @@ -65,7 +65,7 @@ public: const size_t& pIdx2, const size_t& pIdx3, const double k); - /// + /// /// \brief Compute value and gradient of the constraint /// /// \param[in] currVertexPositions vector of current positions @@ -73,8 +73,8 @@ public: /// \param[inout] dcdx constraint gradient /// bool computeValueAndGradient(const StdVectorOfVec3d& currVertexPositions, - double& c, - StdVectorOfVec3d& dcdx) const override; + double& c, + StdVectorOfVec3d& dcdx) const override; public: double m_restAngle = 0.0; ///> Rest angle diff --git a/Source/Constraint/PbdConstraints/imstkPbdDistanceConstraint.cpp b/Source/Constraint/PbdConstraints/imstkPbdDistanceConstraint.cpp index 408dc3474ee5e9fe53d12555a3bc083b0a511397..f0815882793e062cb43330b643a06f8264a4bf77 100644 --- a/Source/Constraint/PbdConstraints/imstkPbdDistanceConstraint.cpp +++ b/Source/Constraint/PbdConstraints/imstkPbdDistanceConstraint.cpp @@ -24,15 +24,15 @@ namespace imstk { void -PbdDistanceConstraint::initConstraint(const StdVectorOfVec3d& initVertexPositions, - const size_t& pIdx0, - const size_t& pIdx1, - const double k) +PbdDistanceConstraint::initConstraint(const StdVectorOfVec3d& initVertexPositions, + const size_t& pIdx0, + const size_t& pIdx1, + const double k) { m_vertexIds[0] = pIdx0; m_vertexIds[1] = pIdx1; m_stiffness = k; - m_compliance = 1.0 / k; + m_compliance = 1.0 / k; const Vec3d& p0 = initVertexPositions[pIdx0]; const Vec3d& p1 = initVertexPositions[pIdx1]; @@ -41,9 +41,9 @@ PbdDistanceConstraint::initConstraint(const StdVectorOfVec3d& initVertexPosition } bool -PbdDistanceConstraint::computeValueAndGradient(const StdVectorOfVec3d& currVertexPositions, - double& c, - StdVectorOfVec3d& dcdx) const +PbdDistanceConstraint::computeValueAndGradient(const StdVectorOfVec3d& currVertexPositions, + double& c, + StdVectorOfVec3d& dcdx) const { const Vec3d& p0 = currVertexPositions[m_vertexIds[0]]; const Vec3d& p1 = currVertexPositions[m_vertexIds[1]]; @@ -52,8 +52,8 @@ PbdDistanceConstraint::computeValueAndGradient(const StdVectorOfVec3d& currVerte dcdx[0] = p0 - p1; const double len = dcdx[0].norm(); dcdx[0] /= len; - dcdx[1] = -dcdx[0]; - c = len - m_restLength; + dcdx[1] = -dcdx[0]; + c = len - m_restLength; return true; } diff --git a/Source/Constraint/PbdConstraints/imstkPbdDistanceConstraint.h b/Source/Constraint/PbdConstraints/imstkPbdDistanceConstraint.h index 81fb8df00ec5e313f016554920da11ca7d3a8ce8..12a7516718723d43461778b97f7ef90b6c3be1b5 100644 --- a/Source/Constraint/PbdConstraints/imstkPbdDistanceConstraint.h +++ b/Source/Constraint/PbdConstraints/imstkPbdDistanceConstraint.h @@ -47,14 +47,13 @@ public: /// \brief Initializes the distance constraint /// void initConstraint(const StdVectorOfVec3d& initVertexPositions, - const size_t& pIdx0, - const size_t& pIdx1, - const double k = 1e5); + const size_t& pIdx0, + const size_t& pIdx1, + const double k = 1e5); bool computeValueAndGradient(const StdVectorOfVec3d& currVertexPositions, - double& c, - StdVectorOfVec3d& dcdx) const override; - + double& c, + StdVectorOfVec3d& dcdx) const override; public: double m_restLength = 0.0; ///> Rest length between the nodes diff --git a/Source/Constraint/PbdConstraints/imstkPbdEdgeEdgeCollisionConstraint.cpp b/Source/Constraint/PbdConstraints/imstkPbdEdgeEdgeCollisionConstraint.cpp index 5c2185e1c1ff0fda99c04fa604afd9571c7634c6..85986e9963e3690f7977c2f6e1854dd387c8b30f 100644 --- a/Source/Constraint/PbdConstraints/imstkPbdEdgeEdgeCollisionConstraint.cpp +++ b/Source/Constraint/PbdConstraints/imstkPbdEdgeEdgeCollisionConstraint.cpp @@ -25,10 +25,10 @@ namespace imstk { void -PbdEdgeEdgeConstraint::initConstraint(const size_t& pIdxA1, - const size_t& pIdxA2, - const size_t& pIdxB1, - const size_t& pIdxB2, +PbdEdgeEdgeConstraint::initConstraint(const size_t& pIdxA1, + const size_t& pIdxA2, + const size_t& pIdxB1, + const size_t& pIdxB2, std::shared_ptr<PbdCollisionConstraintConfig> configA, std::shared_ptr<PbdCollisionConstraintConfig> configB) { @@ -40,11 +40,12 @@ PbdEdgeEdgeConstraint::initConstraint(const size_t& pIdxA1, m_bodiesSecond[1] = pIdxB2; } -bool PbdEdgeEdgeConstraint::computeValueAndGradient(const StdVectorOfVec3d& currVertexPositionsA, - const StdVectorOfVec3d& currVertexPositionsB, - double& cc, - StdVectorOfVec3d& dcdxA, - StdVectorOfVec3d& dcdxB) const +bool +PbdEdgeEdgeConstraint::computeValueAndGradient(const StdVectorOfVec3d& currVertexPositionsA, + const StdVectorOfVec3d& currVertexPositionsB, + double& cc, + StdVectorOfVec3d& dcdxA, + StdVectorOfVec3d& dcdxB) const { const auto i0 = m_bodiesFirst[0]; const auto i1 = m_bodiesFirst[1]; diff --git a/Source/Constraint/PbdConstraints/imstkPbdEdgeEdgeCollisionConstraint.h b/Source/Constraint/PbdConstraints/imstkPbdEdgeEdgeCollisionConstraint.h index 9679f281a89486b5ee912d3b1714f16bb3705add..74b519b35c10956bd23f0e0c7a7e456bf0c61af4 100644 --- a/Source/Constraint/PbdConstraints/imstkPbdEdgeEdgeCollisionConstraint.h +++ b/Source/Constraint/PbdConstraints/imstkPbdEdgeEdgeCollisionConstraint.h @@ -54,7 +54,7 @@ public: /// /// \brief compute value and gradient of constraint function - /// + /// /// \param[in] currVertexPositionsA current positions from object A /// \param[in] currVertexPositionsA current positions from object B /// \param[inout] c constraint value @@ -62,9 +62,8 @@ public: /// bool computeValueAndGradient(const StdVectorOfVec3d& currVertexPositionsA, const StdVectorOfVec3d& currVertexPositionsB, - double& c, - StdVectorOfVec3d& dcdxA, - StdVectorOfVec3d& dcdxB) const override; - + double& c, + StdVectorOfVec3d& dcdxA, + StdVectorOfVec3d& dcdxB) const override; }; } // imstk diff --git a/Source/Constraint/PbdConstraints/imstkPbdFETetConstraint.cpp b/Source/Constraint/PbdConstraints/imstkPbdFETetConstraint.cpp index 8006c93934c068cb11ef0cc2fc7bd289100e48a6..4763b2f29c6d5d94db7561aec5eac5eb262a230d 100644 --- a/Source/Constraint/PbdConstraints/imstkPbdFETetConstraint.cpp +++ b/Source/Constraint/PbdConstraints/imstkPbdFETetConstraint.cpp @@ -43,7 +43,7 @@ PbdFEMTetConstraint::initConstraint(const StdVectorOfVec3d& initVertexPositions, m_elementVolume = (1.0 / 6.0) * (p3 - p0).dot((p1 - p0).cross(p2 - p0)); m_config = config; - m_compliance = 1.0 / ( config->m_lambda + 2*config->m_mu ); + m_compliance = 1.0 / (config->m_lambda + 2 * config->m_mu); Mat3d m; m.col(0) = p0 - p3; @@ -60,9 +60,10 @@ PbdFEMTetConstraint::initConstraint(const StdVectorOfVec3d& initVertexPositions, return false; } -bool PbdFEMTetConstraint::computeValueAndGradient(const StdVectorOfVec3d& currVertexPositions, - double& cval, - StdVectorOfVec3d& dcdx) const +bool +PbdFEMTetConstraint::computeValueAndGradient(const StdVectorOfVec3d& currVertexPositions, + double& cval, + StdVectorOfVec3d& dcdx) const { const auto i0 = m_vertexIds[0]; const auto i1 = m_vertexIds[1]; @@ -73,7 +74,7 @@ bool PbdFEMTetConstraint::computeValueAndGradient(const StdVectorOfVec3d& currVe const Vec3d& p1 = currVertexPositions[i1]; const Vec3d& p2 = currVertexPositions[i2]; const Vec3d& p3 = currVertexPositions[i3]; - + Mat3d m; m.col(0) = p0 - p3; m.col(1) = p1 - p3; @@ -174,7 +175,7 @@ bool PbdFEMTetConstraint::computeValueAndGradient(const StdVectorOfVec3d& currVe } Mat3d gradC = m_elementVolume * P * m_invRestMat.transpose(); - cval = C; + cval = C; cval *= m_elementVolume; dcdx.resize(m_vertexIds.size()); dcdx[0] = gradC.col(0); diff --git a/Source/Constraint/PbdConstraints/imstkPbdFETetConstraint.h b/Source/Constraint/PbdConstraints/imstkPbdFETetConstraint.h index 328890ec632723764aed009cce63eadb2bcb86f3..b2dc8e3d2e0111e9884f275844c7b15f216e0084 100644 --- a/Source/Constraint/PbdConstraints/imstkPbdFETetConstraint.h +++ b/Source/Constraint/PbdConstraints/imstkPbdFETetConstraint.h @@ -57,7 +57,7 @@ public: /// \brief Compute the value and gradient of constraint /// bool computeValueAndGradient(const StdVectorOfVec3d& currVertexPosition, - double& c, - StdVectorOfVec3d& dcdx) const override; + double& c, + StdVectorOfVec3d& dcdx) const override; }; } // imstk diff --git a/Source/Constraint/PbdConstraints/imstkPbdPointTriCollisionConstraint.cpp b/Source/Constraint/PbdConstraints/imstkPbdPointTriCollisionConstraint.cpp index 4058829738e011e765189dcfb62ec3db4f69b5b7..75b13a8d9e49a1a6ab776c8a3cd7b9e55464758a 100644 --- a/Source/Constraint/PbdConstraints/imstkPbdPointTriCollisionConstraint.cpp +++ b/Source/Constraint/PbdConstraints/imstkPbdPointTriCollisionConstraint.cpp @@ -26,10 +26,10 @@ namespace imstk { void -PbdPointTriangleConstraint::initConstraint(const size_t& pIdxA1, - const size_t& pIdxB1, - const size_t& pIdxB2, - const size_t& pIdxB3, +PbdPointTriangleConstraint::initConstraint(const size_t& pIdxA1, + const size_t& pIdxB1, + const size_t& pIdxB2, + const size_t& pIdxB3, std::shared_ptr<PbdCollisionConstraintConfig> configA, std::shared_ptr<PbdCollisionConstraintConfig> configB) { @@ -44,9 +44,9 @@ PbdPointTriangleConstraint::initConstraint(const size_t& pIdxA1, bool PbdPointTriangleConstraint::computeValueAndGradient(const StdVectorOfVec3d& currVertexPositionsA, const StdVectorOfVec3d& currVertexPositionsB, - double& c, - StdVectorOfVec3d& dcdxA, - StdVectorOfVec3d& dcdxB) const + double& c, + StdVectorOfVec3d& dcdxA, + StdVectorOfVec3d& dcdxB) const { const size_t i0 = m_bodiesFirst[0]; const size_t i1 = m_bodiesSecond[0]; diff --git a/Source/Constraint/PbdConstraints/imstkPbdPointTriCollisionConstraint.h b/Source/Constraint/PbdConstraints/imstkPbdPointTriCollisionConstraint.h index dae77f5630f20dd61da92ef9e5e34cf5bdb9fabf..dc6186775c3ce99bc1fa00956c3ff39a6a5c7631 100644 --- a/Source/Constraint/PbdConstraints/imstkPbdPointTriCollisionConstraint.h +++ b/Source/Constraint/PbdConstraints/imstkPbdPointTriCollisionConstraint.h @@ -57,7 +57,7 @@ public: /// /// \brief compute value and gradient of constraint function - /// + /// /// \param[in] currVertexPositionsA current positions from object A /// \param[in] currVertexPositionsA current positions from object B /// \param[inout] c constraint value @@ -65,8 +65,8 @@ public: /// bool computeValueAndGradient(const StdVectorOfVec3d& currVertexPositionsA, const StdVectorOfVec3d& currVertexPositionsB, - double& c, - StdVectorOfVec3d& dcdxA, - StdVectorOfVec3d& dcdxB) const override; + double& c, + StdVectorOfVec3d& dcdxA, + StdVectorOfVec3d& dcdxB) const override; }; } // imstk diff --git a/Source/Constraint/PbdConstraints/imstkPbdVolumeConstraint.cpp b/Source/Constraint/PbdConstraints/imstkPbdVolumeConstraint.cpp index 122622774eaeb460a3db3f7d05de4e8962f0ead1..ef63215ebcfa6e58be138a90c170eb9f9012941f 100644 --- a/Source/Constraint/PbdConstraints/imstkPbdVolumeConstraint.cpp +++ b/Source/Constraint/PbdConstraints/imstkPbdVolumeConstraint.cpp @@ -34,7 +34,7 @@ PbdVolumeConstraint::initConstraint(const StdVectorOfVec3d& initVertexPositions, m_vertexIds[2] = pIdx2; m_vertexIds[3] = pIdx3; - m_stiffness = k; + m_stiffness = k; m_compliance = 1.0 / k; const Vec3d& p0 = initVertexPositions[pIdx0]; @@ -45,9 +45,10 @@ PbdVolumeConstraint::initConstraint(const StdVectorOfVec3d& initVertexPositions, m_restVolume = (1.0 / 6.0) * ((p1 - p0).cross(p2 - p0)).dot(p3 - p0); } -bool PbdVolumeConstraint::computeValueAndGradient(const StdVectorOfVec3d& currVertexPositions, - double& c, - StdVectorOfVec3d& dcdx) const +bool +PbdVolumeConstraint::computeValueAndGradient(const StdVectorOfVec3d& currVertexPositions, + double& c, + StdVectorOfVec3d& dcdx) const { const auto i0 = m_vertexIds[0]; const auto i1 = m_vertexIds[1]; diff --git a/Source/Constraint/PbdConstraints/imstkPbdVolumeConstraint.h b/Source/Constraint/PbdConstraints/imstkPbdVolumeConstraint.h index 7a68d74e3493262f313e57f4bd0902435d49addf..7f92dc4eba9a35b8e006476e9628dd1950300daa 100644 --- a/Source/Constraint/PbdConstraints/imstkPbdVolumeConstraint.h +++ b/Source/Constraint/PbdConstraints/imstkPbdVolumeConstraint.h @@ -55,8 +55,8 @@ public: /// \brief Compute the value and gradient of constraint /// bool computeValueAndGradient(const StdVectorOfVec3d& currVertexPosition, - double& c, - StdVectorOfVec3d& dcdx) const override; + double& c, + StdVectorOfVec3d& dcdx) const override; protected: double m_restVolume = 0.0; ///> Rest volume diff --git a/Source/DynamicalModels/ObjectModels/imstkPbdModel.cpp b/Source/DynamicalModels/ObjectModels/imstkPbdModel.cpp index 762910eeb7e0f0326b06f43b7249cab787293909..82a234009575024483a4251d8aa5a8e39ecc0f5b 100644 --- a/Source/DynamicalModels/ObjectModels/imstkPbdModel.cpp +++ b/Source/DynamicalModels/ObjectModels/imstkPbdModel.cpp @@ -146,7 +146,6 @@ PbdModel::initialize() LOG(WARNING) << "for PBD, k should be between [0, 1]"; } else if (m_parameters->m_solverType == PbdConstraint::SolverType::xPBD && constraint.second <= 1.0) - { LOG(WARNING) << "for xPBD, k is Young's Modulu, and should be much larger than 1"; } @@ -514,7 +513,10 @@ void PbdModel::partitionConstraints(const bool print) { // Form the map { vertex : list_of_constraints_involve_vertex } - PBDConstraintVector& allConstraints = *m_constraints; + PBDConstraintVector& allConstraints = *m_constraints; + + //std::cout << "---------partitionConstraints: " << allConstraints.size() << std::endl; + std::unordered_map<size_t, std::vector<size_t>> vertexConstraints; for (size_t constrIdx = 0; constrIdx < allConstraints.size(); ++constrIdx) { @@ -542,7 +544,7 @@ PbdModel::partitionConstraints(const bool print) vertexConstraints.clear(); // do graph coloring for the constraint graph - const auto coloring = constraintGraph.doColoring(); + const auto coloring = constraintGraph.doColoring(Graph::ColoringMethod::WelshPowell); const auto& partitionIndices = coloring.first; const auto numPartitions = coloring.second; assert(partitionIndices.size() == allConstraints.size()); diff --git a/Source/DynamicalModels/ObjectModels/imstkPbdModel.h b/Source/DynamicalModels/ObjectModels/imstkPbdModel.h index d962c6a0f578e7fdf57ded189ae6b270e45517f0..d19efa0302f7c6845477f3b88d3b27735f68c3b3 100644 --- a/Source/DynamicalModels/ObjectModels/imstkPbdModel.h +++ b/Source/DynamicalModels/ObjectModels/imstkPbdModel.h @@ -59,10 +59,10 @@ struct PBDModelConfig std::shared_ptr<PbdFEMConstraintConfig> m_femParams = std::make_shared<PbdFEMConstraintConfig>(PbdFEMConstraintConfig { - 0.0, // Lame constant, if constraint type is FEM - 0.0, // Lame constant, if constraint type is FEM - 1000.0, // FEM parameter, if constraint type is FEM - 0.2 // FEM parameter, if constraint type is FEM + 0.0, // Lame constant, if constraint type is FEM + 0.0, // Lame constant, if constraint type is FEM + 1000.0, // FEM parameter, if constraint type is FEM + 0.2 // FEM parameter, if constraint type is FEM }); ///> Info shared between the fem constraints std::vector<std::pair<PbdConstraint::Type, double>> m_regularConstraints; ///> Constraints except FEM @@ -281,7 +281,7 @@ protected: void initGraphEdges(std::shared_ptr<ComputeNode> source, std::shared_ptr<ComputeNode> sink) override; protected: - bool m_partitioned = false; /// \todo this is used in initialize() as a temporary fix to problems on linux + bool m_partitioned = false; /// \todo this is used in initialize() as a temporary fix to problems on linux size_t m_partitionThreshold = 16; ///> Threshold for constraint partitioning std::shared_ptr<PbdSolver> m_pbdSolver = nullptr; ///> PBD solver diff --git a/Source/Solvers/imstkPbdSolver.cpp b/Source/Solvers/imstkPbdSolver.cpp index c3cf20071349b081a9fb7f6964f2b6af4cdab770..a03ff5351351d8448fa6371394dc1600eaaffe29 100644 --- a/Source/Solvers/imstkPbdSolver.cpp +++ b/Source/Solvers/imstkPbdSolver.cpp @@ -52,8 +52,8 @@ PbdSolver::solve() { const PBDConstraintVector& constraintPartition = partitionedConstraints[j]; ParallelUtils::parallelFor(constraintPartition.size(), - [&](const size_t idx) { constraintPartition[idx]->zeroOutLambda(); } - ); + [&](const size_t idx) { constraintPartition[idx]->zeroOutLambda(); } + ); } unsigned int i = 0; @@ -66,7 +66,7 @@ PbdSolver::solve() for (size_t j = 0; j < partitionedConstraints.size(); j++) { - const PBDConstraintVector& constraintPartition = partitionedConstraints[j]; + const PBDConstraintVector& constraintPartition = partitionedConstraints[j]; ParallelUtils::parallelFor(constraintPartition.size(), [&](const size_t idx) diff --git a/Source/Solvers/imstkPbdSolver.h b/Source/Solvers/imstkPbdSolver.h index 8d7f61d748409bc15fdbfea835536fbdd17f64e0..f7012d6b5766bd9e6315db03f85812299793909b 100644 --- a/Source/Solvers/imstkPbdSolver.h +++ b/Source/Solvers/imstkPbdSolver.h @@ -120,7 +120,7 @@ public: private: size_t m_iterations = 20; ///> Number of NL Gauss-Seidel iterations for regular constraints - double m_dt; ///> time step + double m_dt; ///> time step std::shared_ptr<std::vector<PBDConstraintVector>> m_partitionedConstraints = nullptr; ///> Set of vector'd/partitioned pbd constraints std::shared_ptr<PBDConstraintVector> m_constraints = nullptr; ///> Vector of constraints