From a67efcda059c9eba087b1e8a79dfddc4dfcc16d7 Mon Sep 17 00:00:00 2001 From: Hugo Talbot Date: Tue, 13 Aug 2024 18:43:01 +0200 Subject: [PATCH 1/4] rename DiagonalVelocityDampingForceField in NodalLinearDampingForceField --- ...cityDampingForceField.cpp => NodalLinearDampingForceField.cpp} | 0 ...VelocityDampingForceField.h => NodalLinearDampingForceField.h} | 0 ...cityDampingForceField.inl => NodalLinearDampingForceField.inl} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/{DiagonalVelocityDampingForceField.cpp => NodalLinearDampingForceField.cpp} (100%) rename Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/{DiagonalVelocityDampingForceField.h => NodalLinearDampingForceField.h} (100%) rename Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/{DiagonalVelocityDampingForceField.inl => NodalLinearDampingForceField.inl} (100%) diff --git a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/DiagonalVelocityDampingForceField.cpp b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/NodalLinearDampingForceField.cpp similarity index 100% rename from Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/DiagonalVelocityDampingForceField.cpp rename to Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/NodalLinearDampingForceField.cpp diff --git a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/DiagonalVelocityDampingForceField.h b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/NodalLinearDampingForceField.h similarity index 100% rename from Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/DiagonalVelocityDampingForceField.h rename to Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/NodalLinearDampingForceField.h diff --git a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/DiagonalVelocityDampingForceField.inl b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/NodalLinearDampingForceField.inl similarity index 100% rename from Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/DiagonalVelocityDampingForceField.inl rename to Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/NodalLinearDampingForceField.inl From 42b82069c1d57e125e69d85e7e5e0e3533279944 Mon Sep 17 00:00:00 2001 From: Hugo Talbot Date: Tue, 13 Aug 2024 18:45:14 +0200 Subject: [PATCH 2/4] update class NodalLinearDampingForceField --- .../NodalLinearDampingForceField.cpp | 30 ++-- .../NodalLinearDampingForceField.h | 34 ++-- .../NodalLinearDampingForceField.inl | 151 ++++++++++++------ 3 files changed, 130 insertions(+), 85 deletions(-) diff --git a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/NodalLinearDampingForceField.cpp b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/NodalLinearDampingForceField.cpp index ff44e31cd8c..91fa99e12cb 100644 --- a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/NodalLinearDampingForceField.cpp +++ b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/NodalLinearDampingForceField.cpp @@ -19,9 +19,9 @@ * * * Contact information: contact@sofa-framework.org * ******************************************************************************/ -#define SOFA_COMPONENT_FORCEFIELD_DIAGONALVELOCITYDAMPINGFORCEFIELD_CPP +#define SOFA_COMPONENT_FORCEFIELD_NODALLINEARDAMPINGFORCEFIELD_CPP -#include +#include #include #include #include @@ -31,21 +31,21 @@ namespace sofa::component::mechanicalload using namespace sofa::defaulttype; -int DiagonalVelocityDampingForceFieldClass = core::RegisterObject("Diagonal velocity damping") -.add< DiagonalVelocityDampingForceField >() -.add< DiagonalVelocityDampingForceField >() -.add< DiagonalVelocityDampingForceField >() -.add< DiagonalVelocityDampingForceField >() -.add< DiagonalVelocityDampingForceField >() -.add< DiagonalVelocityDampingForceField >() +int NodalLinearDampingForceFieldClass = core::RegisterObject("Linear damping force applied on the degrees of freedom") +.add< NodalLinearDampingForceField >() +.add< NodalLinearDampingForceField >() +.add< NodalLinearDampingForceField >() +.add< NodalLinearDampingForceField >() +.add< NodalLinearDampingForceField >() +.add< NodalLinearDampingForceField >() ; -template class SOFA_COMPONENT_MECHANICALLOAD_API DiagonalVelocityDampingForceField; -template class SOFA_COMPONENT_MECHANICALLOAD_API DiagonalVelocityDampingForceField; -template class SOFA_COMPONENT_MECHANICALLOAD_API DiagonalVelocityDampingForceField; -template class SOFA_COMPONENT_MECHANICALLOAD_API DiagonalVelocityDampingForceField; -template class SOFA_COMPONENT_MECHANICALLOAD_API DiagonalVelocityDampingForceField; -template class SOFA_COMPONENT_MECHANICALLOAD_API DiagonalVelocityDampingForceField; +template class SOFA_COMPONENT_MECHANICALLOAD_API NodalLinearDampingForceField; +template class SOFA_COMPONENT_MECHANICALLOAD_API NodalLinearDampingForceField; +template class SOFA_COMPONENT_MECHANICALLOAD_API NodalLinearDampingForceField; +template class SOFA_COMPONENT_MECHANICALLOAD_API NodalLinearDampingForceField; +template class SOFA_COMPONENT_MECHANICALLOAD_API NodalLinearDampingForceField; +template class SOFA_COMPONENT_MECHANICALLOAD_API NodalLinearDampingForceField; } // namespace sofa::component::mechanicalload diff --git a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/NodalLinearDampingForceField.h b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/NodalLinearDampingForceField.h index c39b41bcb8b..54ca22fd7e4 100644 --- a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/NodalLinearDampingForceField.h +++ b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/NodalLinearDampingForceField.h @@ -20,19 +20,19 @@ * Contact information: contact@sofa-framework.org * ******************************************************************************/ #pragma once -#include +#include #include namespace sofa::component::mechanicalload { -/// Apply damping forces to given degrees of freedom. +/// Apply damping forces to given degrees of freedom template -class DiagonalVelocityDampingForceField : public core::behavior::ForceField +class NodalLinearDampingForceField : public core::behavior::ForceField { public: - SOFA_CLASS(SOFA_TEMPLATE(DiagonalVelocityDampingForceField, DataTypes), SOFA_TEMPLATE(core::behavior::ForceField, DataTypes)); + SOFA_CLASS(SOFA_TEMPLATE(NodalLinearDampingForceField, DataTypes), SOFA_TEMPLATE(core::behavior::ForceField, DataTypes)); typedef core::behavior::ForceField Inherit; typedef typename DataTypes::VecCoord VecCoord; @@ -44,22 +44,19 @@ class DiagonalVelocityDampingForceField : public core::behavior::ForceField DataVecCoord; typedef core::objectmodel::Data DataVecDeriv; - /// velocity damping coefficients (by cinematic dof) + /// Velocity damping coefficients (by cinematic dof) Data< VecDeriv > d_dampingCoefficients; - SOFA_ATTRIBUTE_DISABLED("v23.12", "v24.06", "This Data is now replaced by d_dampingCoefficients") - DeprecatedAndRemoved dampingCoefficients; - protected: - DiagonalVelocityDampingForceField(); + NodalLinearDampingForceField(); + + sofa::core::objectmodel::ComponentState updateFromDampingCoefficient(); public: void addForce (const core::MechanicalParams*, DataVecDeriv&, const DataVecCoord&, const DataVecDeriv&) override; - void addDForce(const core::MechanicalParams* mparams, DataVecDeriv& d_df , const DataVecDeriv& d_dx) override; - void addKToMatrix(sofa::linearalgebra::BaseMatrix * /*m*/, SReal /*kFactor*/, unsigned int &/*offset*/) override {} void buildStiffnessMatrix(core::behavior::StiffnessMatrix* /* matrix */) override; @@ -67,17 +64,16 @@ class DiagonalVelocityDampingForceField : public core::behavior::ForceField; -extern template class SOFA_COMPONENT_MECHANICALLOAD_API DiagonalVelocityDampingForceField; -extern template class SOFA_COMPONENT_MECHANICALLOAD_API DiagonalVelocityDampingForceField; -extern template class SOFA_COMPONENT_MECHANICALLOAD_API DiagonalVelocityDampingForceField; -extern template class SOFA_COMPONENT_MECHANICALLOAD_API DiagonalVelocityDampingForceField; -extern template class SOFA_COMPONENT_MECHANICALLOAD_API DiagonalVelocityDampingForceField; +#if !defined(SOFA_COMPONENT_FORCEFIELD_NODALLINEARDAMPINGFORCEFIELD_CPP) +extern template class SOFA_COMPONENT_MECHANICALLOAD_API NodalLinearDampingForceField; +extern template class SOFA_COMPONENT_MECHANICALLOAD_API NodalLinearDampingForceField; +extern template class SOFA_COMPONENT_MECHANICALLOAD_API NodalLinearDampingForceField; +extern template class SOFA_COMPONENT_MECHANICALLOAD_API NodalLinearDampingForceField; +extern template class SOFA_COMPONENT_MECHANICALLOAD_API NodalLinearDampingForceField; +extern template class SOFA_COMPONENT_MECHANICALLOAD_API NodalLinearDampingForceField; #endif diff --git a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/NodalLinearDampingForceField.inl b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/NodalLinearDampingForceField.inl index 22f0e05d94c..a83dc0c8485 100644 --- a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/NodalLinearDampingForceField.inl +++ b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/NodalLinearDampingForceField.inl @@ -21,25 +21,98 @@ ******************************************************************************/ #pragma once -#include +#include + #include #include - namespace sofa::component::mechanicalload { + template -DiagonalVelocityDampingForceField::DiagonalVelocityDampingForceField() - : d_dampingCoefficients(initData(&d_dampingCoefficients, "dampingCoefficient", "velocity damping coefficients (by cinematic dof)")) +NodalLinearDampingForceField::NodalLinearDampingForceField() + : d_dampingCoefficients(initData(&d_dampingCoefficients, "dampingCoefficient", "Velocity damping coefficients (by cinematic dof)")) { + sofa::core::objectmodel::Base::addUpdateCallback("updateFromDampingCoefficient", {&d_dampingCoefficients}, [this](const core::DataTracker& ) + { + msg_info() << "call back update: from dampingCoefficient"; + return updateFromDampingCoefficient(); + }, {}); } +template +sofa::core::objectmodel::ComponentState NodalLinearDampingForceField::updateFromDampingCoefficient() +{ + const auto coefs = sofa::helper::getReadAccessor(d_dampingCoefficients); + const unsigned int sizeCoefs = coefs.size(); + + + // Check if the dampingCoefficients vector has a null size + if(sizeCoefs == 0) + { + msg_error() << "Size of the \'dampingCoefficients\' vector is null"; + return sofa::core::objectmodel::ComponentState::Invalid; + } + + // Recover mstate size + const unsigned int sizeMState = this->mstate->getSize(); + + + // If the sizes of the dampingCoefficients vector and the mechanical state mismatch + if(sizeCoefs != sizeMState && sizeCoefs != 1) + { + msg_error() << "Size of the \'dampingCoefficients\' vector does not fit the associated MechanicalObject size"; + return sofa::core::objectmodel::ComponentState::Invalid; + } + + + // If size=1, make a constant vector which size fits the MechanicalObject + if(sizeCoefs == 1) + { + sofa::helper::WriteAccessor > accessorCoefficient = this->d_dampingCoefficients; + VecDeriv constantCoef = accessorCoefficient[0]; + accessorCoefficient.resize(sizeMState); + + for(unsigned j = 0; j < Deriv::total_size; ++j) + { + if(constantCoef[j] < 0_sreal) + { + msg_error() << "Negative \'dampingCoefficients\' given"; + return sofa::core::objectmodel::ComponentState::Invalid; + } + } + + for (int i = 0; i < sizeMState; ++i) + { + accessorCoefficient[i] = constantCoef; + } + } + else + { + for (int i = 0; i < sizeMState; ++i) + { + for(unsigned j = 0; j < Deriv::total_size; ++j) + { + if(coefs[i][j] < 0) + { + msg_error() << "Negative value at the " << i << "th entry of the \'dampingCoefficients\' vector"; + return sofa::core::objectmodel::ComponentState::Invalid; + } + } + } + } + + msg_info() << "Update from dampingCoefficient successfully done"; + return sofa::core::objectmodel::ComponentState::Valid; +} + template -void DiagonalVelocityDampingForceField::addForce(const core::MechanicalParams*, DataVecDeriv&_f, const DataVecCoord&, const DataVecDeriv&_v) +void NodalLinearDampingForceField::addForce(const core::MechanicalParams*, DataVecDeriv&_f, const DataVecCoord& _x, const DataVecDeriv&_v) { + SOFA_UNUSED(_x); const auto coefs = sofa::helper::getReadAccessor(d_dampingCoefficients); if( !coefs.empty() ) @@ -61,7 +134,7 @@ void DiagonalVelocityDampingForceField::addForce(const core::Mechanic } template -void DiagonalVelocityDampingForceField::addDForce(const core::MechanicalParams* mparams, DataVecDeriv& d_df, const DataVecDeriv& d_dx) +void NodalLinearDampingForceField::addDForce(const core::MechanicalParams* mparams, DataVecDeriv& d_df, const DataVecDeriv& d_dx) { const auto& coefs = d_dampingCoefficients.getValue(); std::size_t nbDampingCoeff = coefs.size(); @@ -76,90 +149,66 @@ void DiagonalVelocityDampingForceField::addDForce(const core::Mechani { for (unsigned j = 0; j < Deriv::total_size; j++) { - if (i < nbDampingCoeff) - { - df[i][j] -= dx[i][j] * coefs[i][j] * bfactor; - } - else - { - df[i][j] -= dx[i][j] * coefs.back()[j] * bfactor; - } + df[i][j] -= dx[i][j] * coefs[i][j] * bfactor; } } } } template -void DiagonalVelocityDampingForceField::buildStiffnessMatrix(core::behavior::StiffnessMatrix*) +void NodalLinearDampingForceField::buildStiffnessMatrix(core::behavior::StiffnessMatrix*) { - // DiagonalVelocityDampingForceField is a pure damping component: stiffness is not computed + // NodalLinearDampingForceField is a pure damping component + // No stiffness is computed } template -void DiagonalVelocityDampingForceField::addBToMatrix(sofa::linearalgebra::BaseMatrix * mat, SReal bFact, unsigned int& offset) +void NodalLinearDampingForceField::addBToMatrix(sofa::linearalgebra::BaseMatrix * mat, SReal bFact, unsigned int& offset) { const auto& coefs = d_dampingCoefficients.getValue(); const std::size_t nbDampingCoeff = coefs.size(); - if (!nbDampingCoeff) + if (nbDampingCoeff && bFact) { - return; - } - - const unsigned int size = this->mstate->getSize(); - for (std::size_t i = 0; i < size; i++) - { - const unsigned blockrow = offset + i * Deriv::total_size; - for (unsigned j = 0; j < Deriv::total_size; j++) + const unsigned int size = this->mstate->getSize(); + for (std::size_t i = 0; i < size; i++) { - unsigned row = blockrow + j; - if (i < nbDampingCoeff) + const unsigned blockrow = offset + i * Deriv::total_size; + for (unsigned j = 0; j < Deriv::total_size; j++) { + unsigned row = blockrow + j; mat->add(row, row, -coefs[i][j] * bFact); } - else - { - mat->add(row, row, -coefs.back()[j] * bFact); - } } } } template -void DiagonalVelocityDampingForceField::buildDampingMatrix(core::behavior::DampingMatrix* matrix) +void NodalLinearDampingForceField::buildDampingMatrix(core::behavior::DampingMatrix* matrix) { const auto& coefs = d_dampingCoefficients.getValue(); const std::size_t nbDampingCoeff = coefs.size(); - if (!nbDampingCoeff) + if (nbDampingCoeff) { - return; - } + auto dfdv = matrix->getForceDerivativeIn(this->mstate) + .withRespectToVelocityIn(this->mstate); - auto dfdv = matrix->getForceDerivativeIn(this->mstate) - .withRespectToVelocityIn(this->mstate); - - const unsigned int size = this->mstate->getSize(); - for (std::size_t i = 0; i < size; i++) - { - const unsigned blockrow = i * Deriv::total_size; - for (unsigned j = 0; j < Deriv::total_size; j++) + const unsigned int size = this->mstate->getSize(); + for (std::size_t i = 0; i < size; i++) { - const unsigned row = blockrow + j; - if (i < nbDampingCoeff) + const unsigned blockrow = i * Deriv::total_size; + for (unsigned j = 0; j < Deriv::total_size; j++) { + const unsigned row = blockrow + j; dfdv(row, row) += -coefs[i][j]; } - else - { - dfdv(row, row) += -coefs.back()[j]; - } } } } template -SReal DiagonalVelocityDampingForceField::getPotentialEnergy(const core::MechanicalParams*, const DataVecCoord&) const +SReal NodalLinearDampingForceField::getPotentialEnergy(const core::MechanicalParams*, const DataVecCoord&) const { return 0; } From 9272453970ef2d3900dde3bacb34a6309fe026e4 Mon Sep 17 00:00:00 2001 From: Hugo Talbot Date: Tue, 13 Aug 2024 19:16:49 +0200 Subject: [PATCH 3/4] Deprecate Uniform and Diagonal, create a compatibility with both in NodalLinearDampingFF --- Sofa/Component/MechanicalLoad/CMakeLists.txt | 5 +- ...pp => DiagonalVelocityDampingForceField.h} | 35 ++------ .../DiagonalVelocityDampingForceField.inl | 26 ++++++ .../NodalLinearDampingForceField.h | 14 +++ .../NodalLinearDampingForceField.inl | 10 +-- .../UniformVelocityDampingForceField.h | 68 ++------------ .../UniformVelocityDampingForceField.inl | 89 +------------------ .../src/sofa/helper/ComponentChange.cpp | 6 +- 8 files changed, 67 insertions(+), 186 deletions(-) rename Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/{UniformVelocityDampingForceField.cpp => DiagonalVelocityDampingForceField.h} (55%) create mode 100644 Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/DiagonalVelocityDampingForceField.inl diff --git a/Sofa/Component/MechanicalLoad/CMakeLists.txt b/Sofa/Component/MechanicalLoad/CMakeLists.txt index 6ba52e383ec..a80eb0e59fe 100644 --- a/Sofa/Component/MechanicalLoad/CMakeLists.txt +++ b/Sofa/Component/MechanicalLoad/CMakeLists.txt @@ -21,6 +21,8 @@ set(HEADER_FILES ${SOFACOMPONENTMECHANICALLOAD_SOURCE_DIR}/InteractionEllipsoidForceField.inl ${SOFACOMPONENTMECHANICALLOAD_SOURCE_DIR}/LinearForceField.h ${SOFACOMPONENTMECHANICALLOAD_SOURCE_DIR}/LinearForceField.inl + ${SOFACOMPONENTMECHANICALLOAD_SOURCE_DIR}/NodalLinearDampingForceField.h + ${SOFACOMPONENTMECHANICALLOAD_SOURCE_DIR}/NodalLinearDampingForceField.inl ${SOFACOMPONENTMECHANICALLOAD_SOURCE_DIR}/OscillatingTorsionPressureForceField.h ${SOFACOMPONENTMECHANICALLOAD_SOURCE_DIR}/OscillatingTorsionPressureForceField.inl ${SOFACOMPONENTMECHANICALLOAD_SOURCE_DIR}/PlaneForceField.h @@ -45,12 +47,12 @@ set(SOURCE_FILES ${SOFACOMPONENTMECHANICALLOAD_SOURCE_DIR}/init.cpp ${SOFACOMPONENTMECHANICALLOAD_SOURCE_DIR}/ConicalForceField.cpp ${SOFACOMPONENTMECHANICALLOAD_SOURCE_DIR}/ConstantForceField.cpp - ${SOFACOMPONENTMECHANICALLOAD_SOURCE_DIR}/DiagonalVelocityDampingForceField.cpp ${SOFACOMPONENTMECHANICALLOAD_SOURCE_DIR}/EdgePressureForceField.cpp ${SOFACOMPONENTMECHANICALLOAD_SOURCE_DIR}/EllipsoidForceField.cpp ${SOFACOMPONENTMECHANICALLOAD_SOURCE_DIR}/Gravity.cpp ${SOFACOMPONENTMECHANICALLOAD_SOURCE_DIR}/InteractionEllipsoidForceField.cpp ${SOFACOMPONENTMECHANICALLOAD_SOURCE_DIR}/LinearForceField.cpp + ${SOFACOMPONENTMECHANICALLOAD_SOURCE_DIR}/NodalLinearDampingForceField.cpp ${SOFACOMPONENTMECHANICALLOAD_SOURCE_DIR}/OscillatingTorsionPressureForceField.cpp ${SOFACOMPONENTMECHANICALLOAD_SOURCE_DIR}/PlaneForceField.cpp ${SOFACOMPONENTMECHANICALLOAD_SOURCE_DIR}/QuadPressureForceField.cpp @@ -59,7 +61,6 @@ set(SOURCE_FILES ${SOFACOMPONENTMECHANICALLOAD_SOURCE_DIR}/TaitSurfacePressureForceField.cpp ${SOFACOMPONENTMECHANICALLOAD_SOURCE_DIR}/TorsionForceField.cpp ${SOFACOMPONENTMECHANICALLOAD_SOURCE_DIR}/TrianglePressureForceField.cpp - ${SOFACOMPONENTMECHANICALLOAD_SOURCE_DIR}/UniformVelocityDampingForceField.cpp ) sofa_find_package(Sofa.Simulation.Core REQUIRED) diff --git a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/UniformVelocityDampingForceField.cpp b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/DiagonalVelocityDampingForceField.h similarity index 55% rename from Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/UniformVelocityDampingForceField.cpp rename to Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/DiagonalVelocityDampingForceField.h index c53d069fe1e..f7768787652 100644 --- a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/UniformVelocityDampingForceField.cpp +++ b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/DiagonalVelocityDampingForceField.h @@ -19,35 +19,14 @@ * * * Contact information: contact@sofa-framework.org * ******************************************************************************/ -#define SOFA_COMPONENT_FORCEFIELD_UNIFORMVELOCITYDAMPINGFORCEFIELD_CPP +#pragma once -#include -#include -#include -#include +#include + +SOFA_HEADER_DEPRECATED("v24.12", "v25.12", "sofa/component/mechanicalload/NodalLinearDampingForceField.h") namespace sofa::component::mechanicalload { - -using namespace sofa::defaulttype; - -int UniformVelocityDampingForceFieldClass = core::RegisterObject("Uniform velocity damping") -.add< UniformVelocityDampingForceField >() -.add< UniformVelocityDampingForceField >() -.add< UniformVelocityDampingForceField >() -.add< UniformVelocityDampingForceField >() -.add< UniformVelocityDampingForceField >() -.add< UniformVelocityDampingForceField >() - -; - - - template class SOFA_COMPONENT_MECHANICALLOAD_API UniformVelocityDampingForceField; - template class SOFA_COMPONENT_MECHANICALLOAD_API UniformVelocityDampingForceField; - template class SOFA_COMPONENT_MECHANICALLOAD_API UniformVelocityDampingForceField; - template class SOFA_COMPONENT_MECHANICALLOAD_API UniformVelocityDampingForceField; - template class SOFA_COMPONENT_MECHANICALLOAD_API UniformVelocityDampingForceField; - template class SOFA_COMPONENT_MECHANICALLOAD_API UniformVelocityDampingForceField; - - -} // namespace sofa::component::mechanicalload +template +using DiagonalVelocityDampingForceField SOFA_ATTRIBUTE_DEPRECATED("v24.12 ", "v25.12", "DiagonalVelocityDampingForceField has been renamed to NodalLinearDampingForceField") = NodalLinearDampingForceField; +} diff --git a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/DiagonalVelocityDampingForceField.inl b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/DiagonalVelocityDampingForceField.inl new file mode 100644 index 00000000000..7d6f9ae5fc0 --- /dev/null +++ b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/DiagonalVelocityDampingForceField.inl @@ -0,0 +1,26 @@ +/****************************************************************************** +* SOFA, Simulation Open-Framework Architecture * +* (c) 2006 INRIA, USTL, UJF, CNRS, MGH * +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by * +* the Free Software Foundation; either version 2.1 of the License, or (at * +* your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this program. If not, see . * +******************************************************************************* +* Authors: The SOFA Team and external contributors (see Authors.txt) * +* * +* Contact information: contact@sofa-framework.org * +******************************************************************************/ +#pragma once + +#include + +SOFA_HEADER_DEPRECATED("v24.12", "v25.12", "sofa/component/mechanicalload/NodalLinearDampingForceField.inl") diff --git a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/NodalLinearDampingForceField.h b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/NodalLinearDampingForceField.h index 54ca22fd7e4..3e41cb158c6 100644 --- a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/NodalLinearDampingForceField.h +++ b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/NodalLinearDampingForceField.h @@ -55,6 +55,20 @@ class NodalLinearDampingForceField : public core::behavior::ForceFieldgetAttribute("dampingCoefficient") != nullptr) + { + SReal isotropicDamping = (SReal)arg->getAttributeAsFloat("dampingCoefficient", -1.0); + if(isotropicDamping != -1.0) + d_dampingCoefficients.setValue(isotropicDamping * Deriv()); + } + } + + /// Definition of the ForceField API void addForce (const core::MechanicalParams*, DataVecDeriv&, const DataVecCoord&, const DataVecDeriv&) override; void addDForce(const core::MechanicalParams* mparams, DataVecDeriv& d_df , const DataVecDeriv& d_dx) override; void addKToMatrix(sofa::linearalgebra::BaseMatrix * /*m*/, SReal /*kFactor*/, unsigned int &/*offset*/) override {} diff --git a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/NodalLinearDampingForceField.inl b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/NodalLinearDampingForceField.inl index a83dc0c8485..6032ef24ece 100644 --- a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/NodalLinearDampingForceField.inl +++ b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/NodalLinearDampingForceField.inl @@ -72,30 +72,30 @@ sofa::core::objectmodel::ComponentState NodalLinearDampingForceField: if(sizeCoefs == 1) { sofa::helper::WriteAccessor > accessorCoefficient = this->d_dampingCoefficients; - VecDeriv constantCoef = accessorCoefficient[0]; + Deriv constantCoef = accessorCoefficient[0]; accessorCoefficient.resize(sizeMState); for(unsigned j = 0; j < Deriv::total_size; ++j) { - if(constantCoef[j] < 0_sreal) + if(constantCoef[j] < 0.) { msg_error() << "Negative \'dampingCoefficients\' given"; return sofa::core::objectmodel::ComponentState::Invalid; } } - for (int i = 0; i < sizeMState; ++i) + for (unsigned i = 0; i < sizeMState; ++i) { accessorCoefficient[i] = constantCoef; } } else { - for (int i = 0; i < sizeMState; ++i) + for (unsigned i = 0; i < sizeMState; ++i) { for(unsigned j = 0; j < Deriv::total_size; ++j) { - if(coefs[i][j] < 0) + if(coefs[i][j] < 0.) { msg_error() << "Negative value at the " << i << "th entry of the \'dampingCoefficients\' vector"; return sofa::core::objectmodel::ComponentState::Invalid; diff --git a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/UniformVelocityDampingForceField.h b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/UniformVelocityDampingForceField.h index b00593672e4..7acf422cd06 100644 --- a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/UniformVelocityDampingForceField.h +++ b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/UniformVelocityDampingForceField.h @@ -20,69 +20,13 @@ * Contact information: contact@sofa-framework.org * ******************************************************************************/ #pragma once -#include -#include +#include -namespace sofa::component::mechanicalload -{ +SOFA_HEADER_DEPRECATED("v24.12", "v25.12", "sofa/component/mechanicalload/NodalLinearDampingForceField.h") -/// Apply damping forces to given degrees of freedom. -template -class UniformVelocityDampingForceField : public core::behavior::ForceField +namespace sofa::component::mechanicalload { - -public: - - SOFA_CLASS(SOFA_TEMPLATE(UniformVelocityDampingForceField, DataTypes), SOFA_TEMPLATE(core::behavior::ForceField, DataTypes)); - - typedef core::behavior::ForceField Inherit; - typedef typename DataTypes::VecCoord VecCoord; - typedef typename DataTypes::VecDeriv VecDeriv; - typedef typename DataTypes::Coord Coord; - typedef typename DataTypes::Deriv Deriv; - typedef typename Coord::value_type Real; - typedef type::vector VecIndex; - typedef core::objectmodel::Data DataVecCoord; - typedef core::objectmodel::Data DataVecDeriv; - - SOFA_ATTRIBUTE_DEPRECATED__RENAME_DATA_IN_MECHANICALLOAD() - Data< Real > dampingCoefficient; - - /// air drag coefficient. - Data< Real > d_dampingCoefficient; - Data d_implicit; ///< should it generate damping matrix df/dv? (explicit otherwise, i.e. only generating a force) - -protected: - - UniformVelocityDampingForceField(); - -public: - - void addForce (const core::MechanicalParams*, DataVecDeriv&, const DataVecCoord&, const DataVecDeriv&) override; - - void addDForce(const core::MechanicalParams* mparams, DataVecDeriv& d_df , const DataVecDeriv& d_dx) override; - - void addKToMatrix(sofa::linearalgebra::BaseMatrix *, SReal, unsigned int &) override {} - - void addBToMatrix(sofa::linearalgebra::BaseMatrix * mat, SReal bFact, unsigned int& offset) override; - void buildDampingMatrix(core::behavior::DampingMatrix* matrix) override; - - SReal getPotentialEnergy(const core::MechanicalParams* params, const DataVecCoord& x) const override; - - -}; - - - -#if !defined(SOFA_COMPONENT_FORCEFIELD_UNIFORMVELOCITYDAMPINGFORCEFIELD_CPP) -extern template class SOFA_COMPONENT_MECHANICALLOAD_API UniformVelocityDampingForceField; -extern template class SOFA_COMPONENT_MECHANICALLOAD_API UniformVelocityDampingForceField; -extern template class SOFA_COMPONENT_MECHANICALLOAD_API UniformVelocityDampingForceField; -extern template class SOFA_COMPONENT_MECHANICALLOAD_API UniformVelocityDampingForceField; -extern template class SOFA_COMPONENT_MECHANICALLOAD_API UniformVelocityDampingForceField; -extern template class SOFA_COMPONENT_MECHANICALLOAD_API UniformVelocityDampingForceField; - -#endif - -} // namespace sofa::component::mechanicalload +template +using UniformVelocityDampingForceField SOFA_ATTRIBUTE_DEPRECATED("v24.12 ", "v25.12", "UniformVelocityDampingForceField has been removed. Use instead NodalLinearDampingForceField") = NodalLinearDampingForceField; +} diff --git a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/UniformVelocityDampingForceField.inl b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/UniformVelocityDampingForceField.inl index 1a7faa93898..7d6f9ae5fc0 100644 --- a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/UniformVelocityDampingForceField.inl +++ b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/UniformVelocityDampingForceField.inl @@ -21,91 +21,6 @@ ******************************************************************************/ #pragma once -#include -#include -#include -#include +#include -namespace sofa::component::mechanicalload -{ - - -template -UniformVelocityDampingForceField::UniformVelocityDampingForceField() - : d_dampingCoefficient(initData(&d_dampingCoefficient, Real(0.1), "dampingCoefficient", "velocity damping coefficient")) - , d_implicit(initData(&d_implicit, false, "implicit", "should it generate damping matrix df/dv? (explicit otherwise, i.e. only generating a force)")) -{ - core::objectmodel::Base::addAlias(&d_dampingCoefficient, "damping" ); - dampingCoefficient.setParent(&d_dampingCoefficient); -} - -template -void UniformVelocityDampingForceField::addForce (const core::MechanicalParams*, DataVecDeriv&_f, const DataVecCoord&, const DataVecDeriv&_v) -{ - sofa::helper::WriteAccessor f(_f); - const VecDeriv& v = _v.getValue(); - - for(unsigned int i=0; i -void UniformVelocityDampingForceField::addDForce(const core::MechanicalParams* mparams, DataVecDeriv& d_df , const DataVecDeriv& d_dx) -{ - (void)mparams->kFactor(); // get rid of warning message - - if( !d_implicit.getValue() ) return; - - Real bfactor = (Real)sofa::core::mechanicalparams::bFactor(mparams); - - if( bfactor ) - { - sofa::helper::WriteAccessor df(d_df); - const VecDeriv& dx = d_dx.getValue(); - - bfactor *= d_dampingCoefficient.getValue(); - - for(unsigned int i=0; i -void UniformVelocityDampingForceField::addBToMatrix(sofa::linearalgebra::BaseMatrix * mat, SReal bFact, unsigned int& offset) -{ - if( !d_implicit.getValue() ) return; - - const sofa::Size size = this->mstate->getMatrixSize(); - const auto dampingContribution = -d_dampingCoefficient.getValue() * bFact; - - for( sofa::Size i = 0 ; i < size; ++i ) - { - mat->add( offset + i, offset + i, dampingContribution ); - } -} - -template -void UniformVelocityDampingForceField::buildDampingMatrix(core::behavior::DampingMatrix* matrix) -{ - if( !d_implicit.getValue() ) return; - - auto dfdv = matrix->getForceDerivativeIn(this->mstate) - .withRespectToVelocityIn(this->mstate); - - const sofa::Size size = this->mstate->getMatrixSize(); - const auto damping = sofa::helper::ReadAccessor(d_dampingCoefficient); - for( sofa::Size i = 0; i < size; ++i) - { - dfdv(i, i) += -damping.ref(); - } -} - -template -SReal UniformVelocityDampingForceField::getPotentialEnergy(const core::MechanicalParams*, const DataVecCoord&) const -{ - // TODO - return 0; -} - - -} // namespace sofa::component::mechanicalload +SOFA_HEADER_DEPRECATED("v24.12", "v25.12", "sofa/component/mechanicalload/NodalLinearDampingForceField.inl") diff --git a/Sofa/framework/Helper/src/sofa/helper/ComponentChange.cpp b/Sofa/framework/Helper/src/sofa/helper/ComponentChange.cpp index 6466fcac7df..3c537f666a2 100644 --- a/Sofa/framework/Helper/src/sofa/helper/ComponentChange.cpp +++ b/Sofa/framework/Helper/src/sofa/helper/ComponentChange.cpp @@ -29,7 +29,8 @@ const std::map > deprecatedComponents = { {"RayTraceDetection", Deprecated("v21.06", "v21.12")}, {"BruteForceDetection", Deprecated("v21.06", "v21.12")}, {"DirectSAP", Deprecated("v21.06", "v21.12")}, - {"RigidRigidMapping", Deprecated("v23.06", "v23.12", "You can use the component RigidMapping with template='Rigid3,Rigid3' instead.")}, + {"RigidRigidMapping", Deprecated("v23.06", "v23.12", "You can use the component RigidMapping with template='Rigid3,Rigid3' instead")}, + {"UniformVelocityDampingForceField", Deprecated("v24.12", "v25.06", "You can use the NodalLinearDampingForceField instead")}, }; const std::map > movedComponents = { @@ -759,7 +760,8 @@ const std::map< std::string, Renamed, std::less<> > renamedComponents = { {"UniformConstraint", Renamed("v24.06","v25.06","UniformLagrangianConstraint")}, {"UnilateralInteractionConstraint", Renamed("v24.06","v25.06","UnilateralLagrangianConstraint")}, {"StiffSpringForceField", Renamed("v24.06","v25.06","SpringForceField")}, - {"ParallelStiffSpringForceField", Renamed("v24.06","v25.06","ParallelSpringForceField")} + {"ParallelStiffSpringForceField", Renamed("v24.06","v25.06","ParallelSpringForceField")}, + {"DiagonalVelocityDampingForceField", Renamed("v24.12","v25.12","NodalLinearDampingForceField")} }; From 2e28f152e927336a1d62c158c013aae2b4e03136 Mon Sep 17 00:00:00 2001 From: Hugo Talbot Date: Tue, 13 Aug 2024 20:58:24 +0200 Subject: [PATCH 4/4] fix compilation --- .../mechanicalload/NodalLinearDampingForceField.h | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/NodalLinearDampingForceField.h b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/NodalLinearDampingForceField.h index 3e41cb158c6..2e3760c4092 100644 --- a/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/NodalLinearDampingForceField.h +++ b/Sofa/Component/MechanicalLoad/src/sofa/component/mechanicalload/NodalLinearDampingForceField.h @@ -62,9 +62,18 @@ class NodalLinearDampingForceField : public core::behavior::ForceFieldgetAttribute("dampingCoefficient") != nullptr) { - SReal isotropicDamping = (SReal)arg->getAttributeAsFloat("dampingCoefficient", -1.0); + Real isotropicDamping = (Real)arg->getAttributeAsFloat("dampingCoefficient", -1.0); if(isotropicDamping != -1.0) - d_dampingCoefficients.setValue(isotropicDamping * Deriv()); + { + VecDeriv coef; + coef.resize(1); + + const typename DataTypes::DPos& dpos = DataTypes::getDPos(coef[0]); + for(Size j=0 ; j