From 6d62139bf6cecf9b9aae5c4205ec11d2a5c509bd Mon Sep 17 00:00:00 2001 From: Alex Bilger Date: Thu, 16 Nov 2023 14:26:34 +0100 Subject: [PATCH] [SolidMechanics.Spring] Implement buildStiffnessMatrix for TriangularBendingSprings --- .../spring/TriangularBendingSprings.h | 1 + .../spring/TriangularBendingSprings.inl | 30 +++++++++++- .../Spring/TriangularBendingSprings.scn | 48 ++++++++----------- 3 files changed, 50 insertions(+), 29 deletions(-) diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/TriangularBendingSprings.h b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/TriangularBendingSprings.h index 1c4a57cea86..6b37f9cbfc9 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/TriangularBendingSprings.h +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/TriangularBendingSprings.h @@ -139,6 +139,7 @@ class TriangularBendingSprings : public core::behavior::ForceField void addForce(const core::MechanicalParams* mparams, DataVecDeriv& d_f, const DataVecCoord& d_x, const DataVecDeriv& d_v) override; void addDForce(const core::MechanicalParams* mparams, DataVecDeriv& d_df, const DataVecDeriv& d_dx) override; + void buildStiffnessMatrix(core::behavior::StiffnessMatrix* matrix) override; void buildDampingMatrix(core::behavior::DampingMatrix* /*matrix*/) final; void draw(const core::visual::VisualParams* vparams) override; diff --git a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/TriangularBendingSprings.inl b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/TriangularBendingSprings.inl index 90d04039e56..fd9f38232c2 100644 --- a/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/TriangularBendingSprings.inl +++ b/Sofa/Component/SolidMechanics/Spring/src/sofa/component/solidmechanics/spring/TriangularBendingSprings.inl @@ -502,7 +502,7 @@ void TriangularBendingSprings::addForce(const core::MechanicalParams* template void TriangularBendingSprings::addDForce(const core::MechanicalParams* mparams, DataVecDeriv& d_df, const DataVecDeriv& d_dx) { - VecDeriv& df = *d_df.beginEdit(); + auto df = sofa::helper::getWriteAccessor(d_df); const VecDeriv& dx = d_dx.getValue(); Real kFactor = (Real)sofa::core::mechanicalparams::kFactorIncludingRayleighDamping(mparams, this->rayleighStiffness.getValue()); @@ -524,7 +524,33 @@ void TriangularBendingSprings::addDForce(const core::MechanicalParams df[a]+= dforce * kFactor; df[b]-= dforce * kFactor; } - d_df.endEdit(); +} + +template +void TriangularBendingSprings::buildStiffnessMatrix( + core::behavior::StiffnessMatrix* matrix) +{ + auto dfdx = matrix->getForceDerivativeIn(this->mstate) + .withRespectToPositionsIn(this->mstate); + + const type::vector& edgeInf = edgeInfo.getValue(); + + for (sofa::Index i = 0; i < m_topology->getNbEdges(); i++) + { + const EdgeInformation& einfo = edgeInf[i]; + if (einfo.is_activated) // edge not in middle of 2 triangles + { + const sofa::Index a = Deriv::total_size * einfo.m1; + const sofa::Index b = Deriv::total_size * einfo.m2; + + const Mat& dfdxLocal = einfo.DfDx; + + dfdx(a, a) += -dfdxLocal; + dfdx(a, b) += dfdxLocal; + dfdx(b, a) += dfdxLocal; + dfdx(b, b) += -dfdxLocal; + } + } } template diff --git a/examples/Component/SolidMechanics/Spring/TriangularBendingSprings.scn b/examples/Component/SolidMechanics/Spring/TriangularBendingSprings.scn index 608bfc799ed..1b7c86c3000 100644 --- a/examples/Component/SolidMechanics/Spring/TriangularBendingSprings.scn +++ b/examples/Component/SolidMechanics/Spring/TriangularBendingSprings.scn @@ -1,43 +1,37 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - + - + + - + - - - + +