From 0055c35a4ec59f8c7252375f269834139cd4e216 Mon Sep 17 00:00:00 2001 From: eulalie Date: Thu, 19 Oct 2023 16:24:12 +0200 Subject: [PATCH 1/6] [forcefield] updates AdaptiveBeamForceFieldAndMass with new API (buildStiffnessMatrix, etc.) --- .../AdaptiveBeamForceFieldAndMass.h | 4 ++ .../AdaptiveBeamForceFieldAndMass.inl | 61 +++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.h b/src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.h index a02f33025..c6e47c193 100644 --- a/src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.h +++ b/src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.h @@ -140,6 +140,10 @@ class AdaptiveBeamForceFieldAndMass : public core::behavior::Mass void addMToMatrix(const MechanicalParams *mparams, const MultiMatrixAccessor* matrix) override; void addMBKToMatrix(const MechanicalParams* mparams, const MultiMatrixAccessor* matrix) override; + void buildMassMatrix(sofa::core::behavior::MassMatrixAccumulator* matrices) override; + void buildStiffnessMatrix(core::behavior::StiffnessMatrix* matrix) override; + void buildDampingMatrix(core::behavior::DampingMatrix* matrices) override; + //TODO(dmarchal 2017-05-17) So what do we do ? For who is this message intended for ? How can we make this code "more" manageable. void accFromF(const MechanicalParams* mparams, DataVecDeriv& , const DataVecDeriv& ) override { diff --git a/src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.inl b/src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.inl index 6f828f3e6..ea221abe8 100644 --- a/src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.inl +++ b/src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.inl @@ -32,6 +32,8 @@ // #pragma once +#include "sofa/core/behavior/BaseLocalForceFieldMatrix.h" +#include "sofa/core/behavior/BaseLocalMassMatrix.h" #include #include #include @@ -362,6 +364,30 @@ void AdaptiveBeamForceFieldAndMass::addMToMatrix(const MechanicalPara } } +template +void AdaptiveBeamForceFieldAndMass::buildMassMatrix(sofa::core::behavior::MassMatrixAccumulator* matrices) +{ + unsigned int numBeams = l_interpolation->getNumBeams(); + + for (unsigned int b=0; bgetNodeIndices( b, node0Idx, node1Idx ); + + /// matrices in global frame + const Matrix6x6 M00 = bLM.m_A0Ref.multTranspose((bLM.m_M00 * bLM.m_A0Ref)); + const Matrix6x6 M01 = bLM.m_A0Ref.multTranspose((bLM.m_M01 * bLM.m_A1Ref)); + const Matrix6x6 M10 = bLM.m_A1Ref.multTranspose((bLM.m_M10 * bLM.m_A0Ref)); + const Matrix6x6 M11 = bLM.m_A1Ref.multTranspose((bLM.m_M11 * bLM.m_A1Ref)); + + matrices->add(node0Idx * 6, node0Idx * 6, M00); + matrices->add(node0Idx * 6, node1Idx * 6, M01); + matrices->add(node1Idx * 6, node0Idx * 6, M10); + matrices->add(node1Idx * 6, node1Idx * 6, M11); + } +} + template void AdaptiveBeamForceFieldAndMass::addMBKToMatrix(const MechanicalParams* mparams, @@ -426,6 +452,12 @@ void AdaptiveBeamForceFieldAndMass::addMBKToMatrix(const MechanicalPa } } +template +void AdaptiveBeamForceFieldAndMass::buildDampingMatrix(core::behavior::DampingMatrix*) +{ + // No damping in this ForceField +} + ///////////////////////////////////// /// ForceField Interface @@ -685,6 +717,35 @@ void AdaptiveBeamForceFieldAndMass::addKToMatrix(const MechanicalPara } } +template +void AdaptiveBeamForceFieldAndMass::buildStiffnessMatrix(core::behavior::StiffnessMatrix* matrix) +{ + unsigned int numBeams = l_interpolation->getNumBeams(); + + auto dfdx = matrix->getForceDerivativeIn(this->mstate) + .withRespectToPositionsIn(this->mstate); + + for (unsigned int b=0; bgetNodeIndices( b, node0Idx, node1Idx ); + + if(node0Idx==node1Idx) + continue; + + // matrices in global frame + Matrix6x6 K00 = beamLocalMatrix.m_A0Ref.multTranspose((beamLocalMatrix.m_K00 * beamLocalMatrix.m_A0Ref)); + Matrix6x6 K01 = beamLocalMatrix.m_A0Ref.multTranspose((beamLocalMatrix.m_K01 * beamLocalMatrix.m_A1Ref)); + Matrix6x6 K10 = beamLocalMatrix.m_A1Ref.multTranspose((beamLocalMatrix.m_K10 * beamLocalMatrix.m_A0Ref)); + Matrix6x6 K11 = beamLocalMatrix.m_A1Ref.multTranspose((beamLocalMatrix.m_K11 * beamLocalMatrix.m_A1Ref)); + + dfdx(node0Idx*6, node0Idx*6) += - K00; + dfdx(node0Idx*6, node1Idx*6) += - K01; + dfdx(node1Idx*6, node0Idx*6) += - K10; + dfdx(node1Idx*6, node1Idx*6) += - K11; + } +} ///////////////////////////////////// From c76a8560b722602ec82ef01c8b0a59ba341e2bda Mon Sep 17 00:00:00 2001 From: EulalieCoevoet Date: Fri, 20 Oct 2023 09:29:43 +0200 Subject: [PATCH 2/6] Update src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.inl Co-authored-by: Alex Bilger --- .../forcefield/AdaptiveBeamForceFieldAndMass.inl | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.inl b/src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.inl index ea221abe8..cf0cc37c0 100644 --- a/src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.inl +++ b/src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.inl @@ -376,10 +376,11 @@ void AdaptiveBeamForceFieldAndMass::buildMassMatrix(sofa::core::behav l_interpolation->getNodeIndices( b, node0Idx, node1Idx ); /// matrices in global frame - const Matrix6x6 M00 = bLM.m_A0Ref.multTranspose((bLM.m_M00 * bLM.m_A0Ref)); - const Matrix6x6 M01 = bLM.m_A0Ref.multTranspose((bLM.m_M01 * bLM.m_A1Ref)); - const Matrix6x6 M10 = bLM.m_A1Ref.multTranspose((bLM.m_M10 * bLM.m_A0Ref)); - const Matrix6x6 M11 = bLM.m_A1Ref.multTranspose((bLM.m_M11 * bLM.m_A1Ref)); + const Matrix6x6 M00 = bLM.m_A0Ref.multTranspose(bLM.m_M00 * bLM.m_A0Ref); + const Matrix6x6 M01 = bLM.m_A0Ref.multTranspose(bLM.m_M01 * bLM.m_A1Ref); + const Matrix6x6 M10 = bLM.m_A1Ref.multTranspose(bLM.m_M10 * bLM.m_A0Ref); + const Matrix6x6 M11 = bLM.m_A1Ref.multTranspose(bLM.m_M11 * bLM.m_A1Ref); + matrices->add(node0Idx * 6, node0Idx * 6, M00); matrices->add(node0Idx * 6, node1Idx * 6, M01); From 14e36edaadbb1464a64678c7411bd2c323deba89 Mon Sep 17 00:00:00 2001 From: EulalieCoevoet Date: Fri, 20 Oct 2023 09:30:14 +0200 Subject: [PATCH 3/6] Update src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.inl Co-authored-by: Alex Bilger --- .../forcefield/AdaptiveBeamForceFieldAndMass.inl | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.inl b/src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.inl index cf0cc37c0..ec46a8717 100644 --- a/src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.inl +++ b/src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.inl @@ -736,10 +736,11 @@ void AdaptiveBeamForceFieldAndMass::buildStiffnessMatrix(core::behavi continue; // matrices in global frame - Matrix6x6 K00 = beamLocalMatrix.m_A0Ref.multTranspose((beamLocalMatrix.m_K00 * beamLocalMatrix.m_A0Ref)); - Matrix6x6 K01 = beamLocalMatrix.m_A0Ref.multTranspose((beamLocalMatrix.m_K01 * beamLocalMatrix.m_A1Ref)); - Matrix6x6 K10 = beamLocalMatrix.m_A1Ref.multTranspose((beamLocalMatrix.m_K10 * beamLocalMatrix.m_A0Ref)); - Matrix6x6 K11 = beamLocalMatrix.m_A1Ref.multTranspose((beamLocalMatrix.m_K11 * beamLocalMatrix.m_A1Ref)); + Matrix6x6 K00 = beamLocalMatrix.m_A0Ref.multTranspose(beamLocalMatrix.m_K00 * beamLocalMatrix.m_A0Ref); + Matrix6x6 K01 = beamLocalMatrix.m_A0Ref.multTranspose(beamLocalMatrix.m_K01 * beamLocalMatrix.m_A1Ref); + Matrix6x6 K10 = beamLocalMatrix.m_A1Ref.multTranspose(beamLocalMatrix.m_K10 * beamLocalMatrix.m_A0Ref); + Matrix6x6 K11 = beamLocalMatrix.m_A1Ref.multTranspose(beamLocalMatrix.m_K11 * beamLocalMatrix.m_A1Ref); + dfdx(node0Idx*6, node0Idx*6) += - K00; dfdx(node0Idx*6, node1Idx*6) += - K01; From aa8fda60be627d7123d90dfe489e63be0da453ee Mon Sep 17 00:00:00 2001 From: EulalieCoevoet Date: Fri, 20 Oct 2023 09:30:53 +0200 Subject: [PATCH 4/6] Update src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.inl Co-authored-by: Alex Bilger --- .../component/forcefield/AdaptiveBeamForceFieldAndMass.inl | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.inl b/src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.inl index ec46a8717..3e38df5da 100644 --- a/src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.inl +++ b/src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.inl @@ -32,8 +32,9 @@ // #pragma once -#include "sofa/core/behavior/BaseLocalForceFieldMatrix.h" -#include "sofa/core/behavior/BaseLocalMassMatrix.h" +#include +#include + #include #include #include From 85cd0497e1585759db472d1260f1d0e656ae6bc6 Mon Sep 17 00:00:00 2001 From: EulalieCoevoet Date: Fri, 20 Oct 2023 09:31:19 +0200 Subject: [PATCH 5/6] Update src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.inl Co-authored-by: Alex Bilger --- .../component/forcefield/AdaptiveBeamForceFieldAndMass.inl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.inl b/src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.inl index 3e38df5da..cdac4a4a9 100644 --- a/src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.inl +++ b/src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.inl @@ -722,7 +722,8 @@ void AdaptiveBeamForceFieldAndMass::addKToMatrix(const MechanicalPara template void AdaptiveBeamForceFieldAndMass::buildStiffnessMatrix(core::behavior::StiffnessMatrix* matrix) { - unsigned int numBeams = l_interpolation->getNumBeams(); + const unsigned int numBeams = l_interpolation->getNumBeams(); + auto dfdx = matrix->getForceDerivativeIn(this->mstate) .withRespectToPositionsIn(this->mstate); From e9ad58f0672ca06d61eb8fd5c4b711bd847a0093 Mon Sep 17 00:00:00 2001 From: EulalieCoevoet Date: Fri, 20 Oct 2023 09:31:26 +0200 Subject: [PATCH 6/6] Update src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.inl Co-authored-by: Alex Bilger --- .../component/forcefield/AdaptiveBeamForceFieldAndMass.inl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.inl b/src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.inl index cdac4a4a9..c124ff59d 100644 --- a/src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.inl +++ b/src/BeamAdapter/component/forcefield/AdaptiveBeamForceFieldAndMass.inl @@ -368,7 +368,8 @@ void AdaptiveBeamForceFieldAndMass::addMToMatrix(const MechanicalPara template void AdaptiveBeamForceFieldAndMass::buildMassMatrix(sofa::core::behavior::MassMatrixAccumulator* matrices) { - unsigned int numBeams = l_interpolation->getNumBeams(); + const unsigned int numBeams = l_interpolation->getNumBeams(); + for (unsigned int b=0; b