From c6c02acbb704f8b00e020cfb1b041360f1a67ae5 Mon Sep 17 00:00:00 2001 From: Alex Bilger Date: Mon, 28 Sep 2026 17:39:07 +0200 Subject: [PATCH 1/3] [Core,IntegrationScheme] Replace legacy propagation by mapping-graph based propagation --- .../StaticEquilibriumIntegrationScheme.cpp | 7 +++-- ...lerationBasedImplicitIntegrationScheme.cpp | 28 ++++++++++--------- ...VelocityBasedImplicitIntegrationScheme.cpp | 18 ++++++------ 3 files changed, 29 insertions(+), 24 deletions(-) diff --git a/Sofa/Component/IntegrationScheme/Backward/src/sofa/component/integrationscheme/backward/StaticEquilibriumIntegrationScheme.cpp b/Sofa/Component/IntegrationScheme/Backward/src/sofa/component/integrationscheme/backward/StaticEquilibriumIntegrationScheme.cpp index 6cf3399d02c..23003e37c5e 100644 --- a/Sofa/Component/IntegrationScheme/Backward/src/sofa/component/integrationscheme/backward/StaticEquilibriumIntegrationScheme.cpp +++ b/Sofa/Component/IntegrationScheme/Backward/src/sofa/component/integrationscheme/backward/StaticEquilibriumIntegrationScheme.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -181,7 +182,7 @@ void StaticEquilibriumIntegrationScheme::integrate(const core::ExecParams* param //Already make a full step updateStatesFromLinearSolution(alpha, firstIt); - m_mop->propagateX(xResult); //Need to propagate explicitly to enable recomputation of mapped Forcefield + simulation::common::DifferentialOperations::pushforwardCoord(m_mappingGraph, *m_params, xResult); computeRHS(false); newResidue = evaluateResidual(); @@ -209,7 +210,7 @@ void StaticEquilibriumIntegrationScheme::integrate(const core::ExecParams* param alpha -= delta; updateStatesFromLinearSolution(-delta, false); - m_mop->propagateX(xResult); //Need to propagate explicitly to enable recomputation of mapped Forcefield + simulation::common::DifferentialOperations::pushforwardCoord(m_mappingGraph, *m_params, xResult); computeRHS(false); newResidue = evaluateResidual(); @@ -226,7 +227,7 @@ void StaticEquilibriumIntegrationScheme::integrate(const core::ExecParams* param if (fabs(alpha - bestalpha )> std::numeric_limits::epsilon() ) { updateStatesFromLinearSolution( bestalpha - alpha, false); - m_mop->propagateX(xResult); //Need to propagate explicitly to enable recomputation of mapped Forcefileld + simulation::common::DifferentialOperations::pushforwardCoord(m_mappingGraph, *m_params, xResult); computeRHS(false); newResidue = evaluateResidual(); diff --git a/Sofa/framework/Simulation/Core/src/sofa/simulation/integrationscheme/AccelerationBasedImplicitIntegrationScheme.cpp b/Sofa/framework/Simulation/Core/src/sofa/simulation/integrationscheme/AccelerationBasedImplicitIntegrationScheme.cpp index 9488cb2c10b..66d04bac00c 100644 --- a/Sofa/framework/Simulation/Core/src/sofa/simulation/integrationscheme/AccelerationBasedImplicitIntegrationScheme.cpp +++ b/Sofa/framework/Simulation/Core/src/sofa/simulation/integrationscheme/AccelerationBasedImplicitIntegrationScheme.cpp @@ -20,12 +20,14 @@ * Contact information: contact@sofa-framework.org * ******************************************************************************/ #include + #include #include #include #include #include #include +#include #include #include @@ -120,9 +122,9 @@ void AccelerationBasedImplicitIntegrationScheme::doSetupIntegrationStep(const co //Propagate intermediate vectors for (unsigned i = 0; i < order; ++i) { - m_mop->propagateX(m_x0[i]); - m_mop->propagateV(m_v0[i]); - m_mop->propagateV(m_a0[i]); + simulation::common::DifferentialOperations::pushforwardCoord(m_mappingGraph, *m_params, m_x0[i]); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_v0[i]); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_a0[i]); } } @@ -198,8 +200,8 @@ void AccelerationBasedImplicitIntegrationScheme::computeRHS(bool firstIteration) if (firstIteration) { - m_mop->propagateDx(m_r1); - m_mop->propagateDx(m_r2); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_r1); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_r2); m_mop->mparams.setV(m_r1); m_mop->addMBKv(m_mappingGraph, m_r0, core::MatricesFactors::M(0.0), @@ -213,7 +215,7 @@ void AccelerationBasedImplicitIntegrationScheme::computeRHS(bool firstIteration) } m_mop->mparams.setV(m_acceleration); - m_mop->propagateDx(m_acceleration); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_acceleration); m_mop->addMBKv(m_mappingGraph, m_r0, core::MatricesFactors::M(-1.0), core::MatricesFactors::B(0), @@ -225,9 +227,9 @@ void AccelerationBasedImplicitIntegrationScheme::computeRHS(bool firstIteration) m_mop->projectResponse(m_mappingGraph, m_r1); m_mop->projectResponse(m_mappingGraph, m_r2); - m_mop->propagateDx(m_r0); - m_mop->propagateDx(m_r1); - m_mop->propagateDx(m_r2); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_r0); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_r1); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_r2); } } @@ -250,7 +252,7 @@ void AccelerationBasedImplicitIntegrationScheme::solveLinearEquation() l_linearSolver->solveSystem(); l_linearSolver->getLinearSystem()->dispatchSystemSolution(m_systemUnknown); - m_mop->propagateDx(m_systemUnknown); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_systemUnknown); } void AccelerationBasedImplicitIntegrationScheme::updateStatesFromLinearSolution(SReal alpha, bool firstIteration) @@ -283,9 +285,9 @@ void AccelerationBasedImplicitIntegrationScheme::updateStatesFromLinearSolution( // TODO this collides with Free motion propagation using a MechanicalVOpVisitor and expecting a EulerImplicit // future implementation of global Newton will reactivate those - // m_mop->propagateX(pos); - // m_mop->propagateV(vel); - // m_mop->propagateDx(acc); + // simulation::common::DifferentialOperations::pushforwardCoord(m_mappingGraph, *m_params, pos); + // simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, vel); + // simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, acc); } diff --git a/Sofa/framework/Simulation/Core/src/sofa/simulation/integrationscheme/VelocityBasedImplicitIntegrationScheme.cpp b/Sofa/framework/Simulation/Core/src/sofa/simulation/integrationscheme/VelocityBasedImplicitIntegrationScheme.cpp index 070e2025dc3..290b9193c07 100644 --- a/Sofa/framework/Simulation/Core/src/sofa/simulation/integrationscheme/VelocityBasedImplicitIntegrationScheme.cpp +++ b/Sofa/framework/Simulation/Core/src/sofa/simulation/integrationscheme/VelocityBasedImplicitIntegrationScheme.cpp @@ -20,12 +20,14 @@ * Contact information: contact@sofa-framework.org * ******************************************************************************/ #include + #include #include #include #include #include #include +#include #include using sofa::simulation::mechanicalvisitor::MechanicalGetNonDiagonalMassesCountVisitor; #include @@ -196,7 +198,7 @@ void VelocityBasedImplicitIntegrationScheme::computeRHS(bool firstIteration) { // This propagation is needed for forcefields that are applied to mapped objects. Then, // those mapped objects need to have the r1 up to date otherwise it'll add 0. - m_mop->propagateDx(m_r1); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_r1); m_mop->mparams.setV(m_r1); m_mop->addMBKv(m_mappingGraph,m_r0, core::MatricesFactors::M(0.0), @@ -212,7 +214,7 @@ void VelocityBasedImplicitIntegrationScheme::computeRHS(bool firstIteration) computeAccelerationFromVelocity(*m_vop, m_acceleration, m_vResult); // Again, as for m_r1, this propagation is needed for Mapped mass. - m_mop->propagateDx(m_acceleration); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_acceleration); m_mop->mparams.setV(m_acceleration); m_mop->addMBKv(m_mappingGraph,m_r0, core::MatricesFactors::M(-1.0), @@ -239,8 +241,8 @@ void VelocityBasedImplicitIntegrationScheme::computeRHS(bool firstIteration) m_mop->projectResponse(m_mappingGraph,m_r0); m_mop->projectResponse(m_mappingGraph,m_r1); - m_mop->propagateDx(m_r0); - m_mop->propagateDx(m_r1); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_r2); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_r1); } } @@ -262,7 +264,7 @@ void VelocityBasedImplicitIntegrationScheme::solveLinearEquation() l_linearSolver->solveSystem(); l_linearSolver->getLinearSystem()->dispatchSystemSolution(m_systemUnknown); - m_mop->propagateDx(m_systemUnknown); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_systemUnknown); } void VelocityBasedImplicitIntegrationScheme::updateStatesFromLinearSolution(SReal alpha, bool firstIteration) @@ -286,8 +288,8 @@ void VelocityBasedImplicitIntegrationScheme::updateStatesFromLinearSolution(SRea // TODO this collides with Free motion propagation using a MechanicalVOpVisitor and expecting a EulerImplicit // future implementation of global Newton will reactivate those - // m_mop->propagateX(pos); - // m_mop->propagateV(vel); + // simulation::common::DifferentialOperations::pushforwardCoord(m_mappingGraph, *m_params, pos); + // simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, vel); } @@ -297,7 +299,7 @@ void VelocityBasedImplicitIntegrationScheme::finalizeIntegrationStep() if (d_computeFinalAcceleration.getValue()) { computeAccelerationFromVelocity(*m_vop, m_acceleration, m_vResult); - m_mop->propagateDx(m_acceleration); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_acceleration); } } From 80d08d3f195e709ef24edb887ae73f0adfd72ff8 Mon Sep 17 00:00:00 2001 From: Alex Bilger Date: Thu, 1 Oct 2026 10:00:06 +0200 Subject: [PATCH 2/3] Fix typo Co-authored-by: Themis Skamagkis <70031729+th-skam@users.noreply.github.com> --- .../VelocityBasedImplicitIntegrationScheme.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sofa/framework/Simulation/Core/src/sofa/simulation/integrationscheme/VelocityBasedImplicitIntegrationScheme.cpp b/Sofa/framework/Simulation/Core/src/sofa/simulation/integrationscheme/VelocityBasedImplicitIntegrationScheme.cpp index 290b9193c07..0bfb00042b4 100644 --- a/Sofa/framework/Simulation/Core/src/sofa/simulation/integrationscheme/VelocityBasedImplicitIntegrationScheme.cpp +++ b/Sofa/framework/Simulation/Core/src/sofa/simulation/integrationscheme/VelocityBasedImplicitIntegrationScheme.cpp @@ -241,7 +241,7 @@ void VelocityBasedImplicitIntegrationScheme::computeRHS(bool firstIteration) m_mop->projectResponse(m_mappingGraph,m_r0); m_mop->projectResponse(m_mappingGraph,m_r1); - simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_r2); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_r0); simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_r1); } From 91f1cbff6c5ed9a57a2ecb4f3ef3b917e335ea94 Mon Sep 17 00:00:00 2001 From: Alex Bilger Date: Thu, 29 Oct 2026 16:26:45 +0100 Subject: [PATCH 3/3] fix usage of mparams --- .../StaticEquilibriumIntegrationScheme.cpp | 4 +-- ...lerationBasedImplicitIntegrationScheme.cpp | 26 +++++++++---------- ...VelocityBasedImplicitIntegrationScheme.cpp | 16 ++++++------ 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/Sofa/Component/IntegrationScheme/Backward/src/sofa/component/integrationscheme/backward/StaticEquilibriumIntegrationScheme.cpp b/Sofa/Component/IntegrationScheme/Backward/src/sofa/component/integrationscheme/backward/StaticEquilibriumIntegrationScheme.cpp index 23003e37c5e..629d3a789c6 100644 --- a/Sofa/Component/IntegrationScheme/Backward/src/sofa/component/integrationscheme/backward/StaticEquilibriumIntegrationScheme.cpp +++ b/Sofa/Component/IntegrationScheme/Backward/src/sofa/component/integrationscheme/backward/StaticEquilibriumIntegrationScheme.cpp @@ -182,7 +182,7 @@ void StaticEquilibriumIntegrationScheme::integrate(const core::ExecParams* param //Already make a full step updateStatesFromLinearSolution(alpha, firstIt); - simulation::common::DifferentialOperations::pushforwardCoord(m_mappingGraph, *m_params, xResult); + simulation::common::DifferentialOperations::pushforwardCoord(m_mappingGraph, m_mop->mparams, xResult); computeRHS(false); newResidue = evaluateResidual(); @@ -227,7 +227,7 @@ void StaticEquilibriumIntegrationScheme::integrate(const core::ExecParams* param if (fabs(alpha - bestalpha )> std::numeric_limits::epsilon() ) { updateStatesFromLinearSolution( bestalpha - alpha, false); - simulation::common::DifferentialOperations::pushforwardCoord(m_mappingGraph, *m_params, xResult); + simulation::common::DifferentialOperations::pushforwardCoord(m_mappingGraph, m_mop->mparams, xResult); computeRHS(false); newResidue = evaluateResidual(); diff --git a/Sofa/framework/Simulation/Core/src/sofa/simulation/integrationscheme/AccelerationBasedImplicitIntegrationScheme.cpp b/Sofa/framework/Simulation/Core/src/sofa/simulation/integrationscheme/AccelerationBasedImplicitIntegrationScheme.cpp index 66d04bac00c..a287a6cebd7 100644 --- a/Sofa/framework/Simulation/Core/src/sofa/simulation/integrationscheme/AccelerationBasedImplicitIntegrationScheme.cpp +++ b/Sofa/framework/Simulation/Core/src/sofa/simulation/integrationscheme/AccelerationBasedImplicitIntegrationScheme.cpp @@ -122,9 +122,9 @@ void AccelerationBasedImplicitIntegrationScheme::doSetupIntegrationStep(const co //Propagate intermediate vectors for (unsigned i = 0; i < order; ++i) { - simulation::common::DifferentialOperations::pushforwardCoord(m_mappingGraph, *m_params, m_x0[i]); - simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_v0[i]); - simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_a0[i]); + simulation::common::DifferentialOperations::pushforwardCoord(m_mappingGraph, m_mop->mparams, m_x0[i]); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, m_mop->mparams, m_v0[i]); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, m_mop->mparams, m_a0[i]); } } @@ -200,8 +200,8 @@ void AccelerationBasedImplicitIntegrationScheme::computeRHS(bool firstIteration) if (firstIteration) { - simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_r1); - simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_r2); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, m_mop->mparams, m_r1); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, m_mop->mparams, m_r2); m_mop->mparams.setV(m_r1); m_mop->addMBKv(m_mappingGraph, m_r0, core::MatricesFactors::M(0.0), @@ -215,7 +215,7 @@ void AccelerationBasedImplicitIntegrationScheme::computeRHS(bool firstIteration) } m_mop->mparams.setV(m_acceleration); - simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_acceleration); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, m_mop->mparams, m_acceleration); m_mop->addMBKv(m_mappingGraph, m_r0, core::MatricesFactors::M(-1.0), core::MatricesFactors::B(0), @@ -227,9 +227,9 @@ void AccelerationBasedImplicitIntegrationScheme::computeRHS(bool firstIteration) m_mop->projectResponse(m_mappingGraph, m_r1); m_mop->projectResponse(m_mappingGraph, m_r2); - simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_r0); - simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_r1); - simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_r2); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, m_mop->mparams, m_r0); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, m_mop->mparams, m_r1); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, m_mop->mparams, m_r2); } } @@ -252,7 +252,7 @@ void AccelerationBasedImplicitIntegrationScheme::solveLinearEquation() l_linearSolver->solveSystem(); l_linearSolver->getLinearSystem()->dispatchSystemSolution(m_systemUnknown); - simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_systemUnknown); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, m_mop->mparams, m_systemUnknown); } void AccelerationBasedImplicitIntegrationScheme::updateStatesFromLinearSolution(SReal alpha, bool firstIteration) @@ -285,9 +285,9 @@ void AccelerationBasedImplicitIntegrationScheme::updateStatesFromLinearSolution( // TODO this collides with Free motion propagation using a MechanicalVOpVisitor and expecting a EulerImplicit // future implementation of global Newton will reactivate those - // simulation::common::DifferentialOperations::pushforwardCoord(m_mappingGraph, *m_params, pos); - // simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, vel); - // simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, acc); + // simulation::common::DifferentialOperations::pushforwardCoord(m_mappingGraph, m_mop->mparams, pos); + // simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, m_mop->mparams, vel); + // simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, m_mop->mparams, acc); } diff --git a/Sofa/framework/Simulation/Core/src/sofa/simulation/integrationscheme/VelocityBasedImplicitIntegrationScheme.cpp b/Sofa/framework/Simulation/Core/src/sofa/simulation/integrationscheme/VelocityBasedImplicitIntegrationScheme.cpp index 0bfb00042b4..a4d49cf3dd7 100644 --- a/Sofa/framework/Simulation/Core/src/sofa/simulation/integrationscheme/VelocityBasedImplicitIntegrationScheme.cpp +++ b/Sofa/framework/Simulation/Core/src/sofa/simulation/integrationscheme/VelocityBasedImplicitIntegrationScheme.cpp @@ -198,7 +198,7 @@ void VelocityBasedImplicitIntegrationScheme::computeRHS(bool firstIteration) { // This propagation is needed for forcefields that are applied to mapped objects. Then, // those mapped objects need to have the r1 up to date otherwise it'll add 0. - simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_r1); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, m_mop->mparams, m_r1); m_mop->mparams.setV(m_r1); m_mop->addMBKv(m_mappingGraph,m_r0, core::MatricesFactors::M(0.0), @@ -214,7 +214,7 @@ void VelocityBasedImplicitIntegrationScheme::computeRHS(bool firstIteration) computeAccelerationFromVelocity(*m_vop, m_acceleration, m_vResult); // Again, as for m_r1, this propagation is needed for Mapped mass. - simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_acceleration); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, m_mop->mparams, m_acceleration); m_mop->mparams.setV(m_acceleration); m_mop->addMBKv(m_mappingGraph,m_r0, core::MatricesFactors::M(-1.0), @@ -241,8 +241,8 @@ void VelocityBasedImplicitIntegrationScheme::computeRHS(bool firstIteration) m_mop->projectResponse(m_mappingGraph,m_r0); m_mop->projectResponse(m_mappingGraph,m_r1); - simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_r0); - simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_r1); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, m_mop->mparams, m_r0); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, m_mop->mparams, m_r1); } } @@ -264,7 +264,7 @@ void VelocityBasedImplicitIntegrationScheme::solveLinearEquation() l_linearSolver->solveSystem(); l_linearSolver->getLinearSystem()->dispatchSystemSolution(m_systemUnknown); - simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_systemUnknown); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, m_mop->mparams, m_systemUnknown); } void VelocityBasedImplicitIntegrationScheme::updateStatesFromLinearSolution(SReal alpha, bool firstIteration) @@ -288,8 +288,8 @@ void VelocityBasedImplicitIntegrationScheme::updateStatesFromLinearSolution(SRea // TODO this collides with Free motion propagation using a MechanicalVOpVisitor and expecting a EulerImplicit // future implementation of global Newton will reactivate those - // simulation::common::DifferentialOperations::pushforwardCoord(m_mappingGraph, *m_params, pos); - // simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, vel); + // simulation::common::DifferentialOperations::pushforwardCoord(m_mappingGraph, m_mop->mparams, pos); + // simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, m_mop->mparams, vel); } @@ -299,7 +299,7 @@ void VelocityBasedImplicitIntegrationScheme::finalizeIntegrationStep() if (d_computeFinalAcceleration.getValue()) { computeAccelerationFromVelocity(*m_vop, m_acceleration, m_vResult); - simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, *m_params, m_acceleration); + simulation::common::DifferentialOperations::pushforwardTangent(m_mappingGraph, m_mop->mparams, m_acceleration); } }