Skip to content

Commit 8224b9c

Browse files
alxbilgerhugtalbotbakpaul
authored
[Simulation] Mapping graph visitors (#6087)
* start implementation of mapping graph visitor * continue * implement interface of MappingGraph * start replacement * remove template * continue replacement * try to fix on non-Windows * fix getBottomUpMappingsFrom * documentation * remove debug log * factorization * know if a node is mapped * Enhance graph traversal with scoped visitation Adds support for targeted node traversal in `MappingGraph::traverseTopDown` using defined scopes: * `ONLY_MAPPED_NODES`: Visits only components involved in mappings. * `ONLY_MAIN_NODES`: Visits component groups that do not rely on external mapping inputs. This change updates the API to provide fine-grained control over which nodes are processed during traversal, and includes new tests validating these scoped behaviors. * feat(core): Support scoped visitation in bottom-up mapping graph traversal Updates `MappingGraph::traverseBottomUp` to accept a `VisitorApplication` scope, ensuring consistent node filtering logic with top-down traversal. This allows targeted processing of nodes (e.g., only mapped or main nodes) when traversing dependencies from the bottom up. Tests are updated to validate scoped bottom-up behavior. * Cache mapped status using optional type Updates `BaseMappingGraphNode::isMapped()` to use `std::optional<bool>` for managing and lazily computing the node's mapped status, improving efficiency of repeated checks. * Add scoped visitation to component group traversal Updates `MappingGraph::traverseComponentGroups` to accept a scope parameter, allowing controlled filtering and processing of component groups during graph traversal. * Refactor: Prefix names with component type in graph traversal tests Updates `MappingGraph2_test` to prepend descriptive prefixes (e.g., `[STATE]`, `[MAPPING]`) to node names visited during traversals, ensuring clear identification of the component type for accurate testing results. * Move classes in their own file * Add callable visitor support for graph traversal Implements overloads for `traverseTopDown_` and `traverseBottomUp_` in `MappingGraph`, allowing users to pass a callable object or lambda directly. This approach simplifies graph traversal by leveraging the new `CallableVisitor` pattern, which automatically handles invoking the provided logic against visited components. Tests are updated to validate lambda usage during complex graph traversals. * Add clear functionality to MappingGraph Introduces a `clear()` method for `MappingGraph` to reset the entire graph state. This function ensures that all internal members, such as root node pointers, build flags, mapping status tracking, and associated data containers, are properly initialized back to their default empty state. * Add callable visitor support for component group traversal Introduces `traverseComponentGroups_` in `MappingGraph`, allowing users to pass a callable object or lambda directly for graph component group traversal. This standardizes the usage of callable visitors across all major graph traversal methods, improving API consistency and reducing boilerplate code. * use MappingGraph in EulerExplicitSolver * use MappingGraph to know if all masses are diagonal * implement computeForce using mapping graph * use iterators for reverse traversal because clang on CI does not support views * Encapsulate graph traversal logic into MappingGraphAlgorithms Extracts all core graph traversal methods (Top-Down, Bottom-Up, component group traversals) from `MappingGraph` and moves their implementation to a dedicated `MappingGraphAlgorithms` class. This improves modularity by separating the algorithm details from the main graph structure API. Updates headers and tests to utilize the new `algorithms` member struct for all traversal calls. * documentation * Enhance graph traversal with parallel execution support Adds an overloaded `traverse` method to `MappingGraphAlgorithms`. This overload allows the graph traversal process to utilize a `TaskScheduler`, executing node visits concurrently for improved performance when processing large graphs on multi-threaded environments. It falls back to synchronous traversal if no scheduler is provided. * start test with interaction force field * more details * more helper functions * export mapping graph as DOT format * prevent data races in component groups * fix * compute force using mapping graph * implement addMBKv * Refactor graph accessors using getters Replaces direct member variable access for internal graph structures (e.g., `m_allNodes`, `m_children`) with public accessor methods like `getAllNodes()` and `getChildren()`. * Refactors ODESolvers and core simulation logic to utilize `MappingGraphMechanicalOperations` * fix wrong comparison * support visits of projective constraint nodes * implement projectResponse in MappingGraphMechanicalOperations --------- Co-authored-by: Hugo <hugo.talbot@sofa-framework.org> Co-authored-by: Paul Baksic <30337881+bakpaul@users.noreply.github.com>
1 parent 8da6f85 commit 8224b9c

25 files changed

Lines changed: 2281 additions & 491 deletions

Sofa/Component/LinearSystem/src/sofa/component/linearsystem/TypedMatrixLinearSystem.inl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ void TypedMatrixLinearSystem<TMatrix, TVector>::preAssembleSystem(const core::Me
7171
{
7272
SCOPED_TIMER_VARNAME(mappingGraphTimer, "buildMappingGraph");
7373
// build the mapping graph: this is used to know the relationship between the mechanical states and their associated components
74-
m_mappingGraph.build(mparams, getSolveContext());
74+
m_mappingGraph.build(getSolveContext());
7575
}
7676

7777
associateLocalMatrixToComponents(mparams);
@@ -191,7 +191,7 @@ void TypedMatrixLinearSystem<TMatrix, TVector>::setRHS(core::MultiVecDerivId v)
191191
{
192192
if (!m_mappingGraph.isBuilt()) //note: this check does not make sure the scene graph is different from when the mapping graph has been built
193193
{
194-
m_mappingGraph.build(core::execparams::defaultInstance(), getSolveContext());
194+
m_mappingGraph.build(getSolveContext());
195195
}
196196

197197
copyLocalVectorToGlobalVector(v, getRHSVector());
@@ -202,7 +202,7 @@ void TypedMatrixLinearSystem<TMatrix, TVector>::setSystemSolution(core::MultiVec
202202
{
203203
if (!m_mappingGraph.isBuilt()) //note: this check does not guarantee the scene graph is not different from when the mapping graph has been built
204204
{
205-
m_mappingGraph.build(core::execparams::defaultInstance(), getSolveContext());
205+
m_mappingGraph.build(getSolveContext());
206206
}
207207

208208
if (!v.isNull())

Sofa/Component/ODESolver/Backward/src/sofa/component/odesolver/backward/EulerImplicitSolver.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
#include <sofa/component/odesolver/backward/EulerImplicitSolver.h>
2323

2424
#include <sofa/core/visual/VisualParams.h>
25-
#include <sofa/simulation/MechanicalOperations.h>
25+
#include <sofa/simulation/MappingGraphMechanicalOperations.h>
2626
#include <sofa/simulation/VectorOperations.h>
2727
#include <sofa/helper/AdvancedTimer.h>
2828
#include <sofa/core/ObjectFactory.h>
@@ -82,11 +82,13 @@ void EulerImplicitSolver::cleanup()
8282

8383
void EulerImplicitSolver::solve(const core::ExecParams* params, SReal dt, sofa::core::MultiVecCoordId xResult, sofa::core::MultiVecDerivId vResult)
8484
{
85+
m_mappingGraph.build(this->getContext());
86+
8587
#ifdef SOFA_DUMP_VISITOR_INFO
8688
sofa::simulation::Visitor::printNode("SolverVectorAllocation");
8789
#endif
8890
sofa::simulation::common::VectorOperations vop( params, this->getContext() );
89-
sofa::simulation::common::MechanicalOperations mop( params, this->getContext() );
91+
sofa::simulation::common::MappingGraphMechanicalOperations mop( params, this->getContext() );
9092
MultiVecCoord pos(&vop, core::vec_id::write_access::position );
9193
MultiVecDeriv vel(&vop, core::vec_id::write_access::velocity );
9294
MultiVecDeriv f(&vop, core::vec_id::write_access::force );
@@ -126,7 +128,7 @@ void EulerImplicitSolver::solve(const core::ExecParams* params, SReal dt, sofa::
126128
SCOPED_TIMER("ComputeForce");
127129
mop->setImplicit(true); // this solver is implicit
128130
// compute the net forces at the beginning of the time step
129-
mop.computeForce(f); //f = Kx + Bv
131+
mop.computeForce(m_mappingGraph, f, true, true, nullptr);
130132

131133
msg_info() << "initial f = " << f;
132134
}
@@ -147,7 +149,7 @@ void EulerImplicitSolver::solve(const core::ExecParams* params, SReal dt, sofa::
147149
msg_info() << "f = " << f;
148150

149151
// add the change of force due to stiffness + Rayleigh damping
150-
mop.addMBKv(b, core::MatricesFactors::M(-d_rayleighMass.getValue()),
152+
mop.addMBKv(m_mappingGraph, b, core::MatricesFactors::M(-d_rayleighMass.getValue()),
151153
core::MatricesFactors::B(0),
152154
core::MatricesFactors::K(h * tr + d_rayleighStiffness.getValue())); // b = f + ( rm M + (h+rs) K ) v
153155

@@ -157,7 +159,7 @@ void EulerImplicitSolver::solve(const core::ExecParams* params, SReal dt, sofa::
157159

158160
msg_info() << "b = " << b;
159161

160-
mop.projectResponse(b); // b is projected to the constrained space
162+
mop.projectResponse(m_mappingGraph, b); // b is projected to the constrained space
161163

162164
msg_info() << "projected b = " << b;
163165
}

Sofa/Component/ODESolver/Backward/src/sofa/component/odesolver/backward/EulerImplicitSolver.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
#pragma once
2323
#include <sofa/component/odesolver/backward/config.h>
2424
#include <sofa/core/behavior/LinearSolverAccessor.h>
25-
2625
#include <sofa/core/behavior/OdeSolver.h>
26+
#include <sofa/simulation/MappingGraph.h>
2727

2828
namespace sofa::simulation::common
2929
{
@@ -178,6 +178,8 @@ class SOFA_COMPONENT_ODESOLVER_BACKWARD_API EulerImplicitSolver :
178178
void reallocSolutionVector(sofa::simulation::common::VectorOperations* vop);
179179
void reallocRightHandSideVector(sofa::simulation::common::VectorOperations* vop);
180180
void reallocResidualVector(sofa::simulation::common::VectorOperations* vop);
181+
182+
sofa::simulation::MappingGraph m_mappingGraph;
181183
};
182184

183185
} // namespace sofa::component::odesolver::backward

Sofa/Component/ODESolver/Forward/src/sofa/component/odesolver/forward/EulerExplicitSolver.cpp

Lines changed: 29 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,8 @@
2727
#include <sofa/helper/AdvancedTimer.h>
2828
#include <sofa/helper/ScopedAdvancedTimer.h>
2929
#include <sofa/simulation/MappingGraph.h>
30-
#include <sofa/simulation/MechanicalOperations.h>
30+
#include <sofa/simulation/MappingGraphMechanicalOperations.h>
3131
#include <sofa/simulation/VectorOperations.h>
32-
#include <sofa/simulation/mechanicalvisitor/MechanicalGetNonDiagonalMassesCountVisitor.h>
33-
using sofa::simulation::mechanicalvisitor::MechanicalGetNonDiagonalMassesCountVisitor;
3432

3533
//#define SOFA_NO_VMULTIOP
3634

@@ -66,10 +64,12 @@ void EulerExplicitSolver::solve(const core::ExecParams* params,
6664

6765
SCOPED_TIMER("EulerExplicitSolve");
6866

67+
m_mappingGraph.build(this->getContext());
68+
6969
// Create the vector and mechanical operations tools. These are used to execute special operations (multiplication,
7070
// additions, etc.) on multi-vectors (a vector that is stored in different buffers inside the mechanical objects)
7171
sofa::simulation::common::VectorOperations vop( params, this->getContext() );
72-
sofa::simulation::common::MechanicalOperations mop( params, this->getContext() );
72+
sofa::simulation::common::MappingGraphMechanicalOperations mop( params, this->getContext() );
7373

7474
// Let the mechanical operations know that the current solver is explicit. This will be propagated back to the
7575
// force fields during the addForce and addKToMatrix phase. Force fields use this information to avoid
@@ -121,7 +121,7 @@ void EulerExplicitSolver::solve(const core::ExecParams* params,
121121
}
122122

123123
void EulerExplicitSolver::updateState(sofa::simulation::common::VectorOperations* vop,
124-
sofa::simulation::common::MechanicalOperations* mop,
124+
sofa::simulation::common::MappingGraphMechanicalOperations* mop,
125125
sofa::core::MultiVecCoordId xResult,
126126
sofa::core::MultiVecDerivId vResult,
127127
const sofa::core::behavior::MultiVecDeriv& acc,
@@ -267,7 +267,7 @@ void EulerExplicitSolver::init()
267267
d_componentState.setValue(sofa::core::objectmodel::ComponentState::Valid);
268268
}
269269

270-
void EulerExplicitSolver::addSeparateGravity(sofa::simulation::common::MechanicalOperations* mop, SReal dt, core::MultiVecDerivId v)
270+
void EulerExplicitSolver::addSeparateGravity(sofa::simulation::common::MappingGraphMechanicalOperations* mop, SReal dt, core::MultiVecDerivId v)
271271
{
272272
SCOPED_TIMER("addSeparateGravity");
273273

@@ -277,17 +277,17 @@ void EulerExplicitSolver::addSeparateGravity(sofa::simulation::common::Mechanica
277277
mop->addSeparateGravity(dt, v);
278278
}
279279

280-
void EulerExplicitSolver::computeForce(sofa::simulation::common::MechanicalOperations* mop, core::MultiVecDerivId f)
280+
void EulerExplicitSolver::computeForce(sofa::simulation::common::MappingGraphMechanicalOperations* mop, core::MultiVecDerivId f) const
281281
{
282282
SCOPED_TIMER("ComputeForce");
283283

284284
// 1. Clear the force vector (F := 0)
285285
// 2. Go down in the current context tree calling addForce on every forcefields
286286
// 3. Go up from the current context tree leaves calling applyJT on every mechanical mappings
287-
mop->computeForce(f);
287+
mop->computeForce(m_mappingGraph, f, true, true, nullptr);
288288
}
289289

290-
void EulerExplicitSolver::computeAcceleration(sofa::simulation::common::MechanicalOperations* mop, core::MultiVecDerivId acc, core::ConstMultiVecDerivId f)
290+
void EulerExplicitSolver::computeAcceleration(sofa::simulation::common::MappingGraphMechanicalOperations* mop, core::MultiVecDerivId acc, core::ConstMultiVecDerivId f)
291291
{
292292
SCOPED_TIMER("AccFromF");
293293

@@ -299,25 +299,25 @@ void EulerExplicitSolver::computeAcceleration(sofa::simulation::common::Mechanic
299299
mop->accFromF(acc, f);
300300
}
301301

302-
void EulerExplicitSolver::projectResponse(sofa::simulation::common::MechanicalOperations* mop, core::MultiVecDerivId vecId)
302+
void EulerExplicitSolver::projectResponse(sofa::simulation::common::MappingGraphMechanicalOperations* mop, core::MultiVecDerivId vecId) const
303303
{
304304
SCOPED_TIMER("projectResponse");
305305

306306
// Calls the "projectResponse" method of every BaseProjectiveConstraintSet objects found in the
307307
// current context tree. An example of such constraint set is the FixedProjectiveConstraint. In this case,
308308
// it will set to 0 every row (i, _) of the input vector for the ith degree of freedom.
309-
mop->projectResponse(vecId);
309+
mop->projectResponse(m_mappingGraph, vecId);
310310
}
311311

312-
void EulerExplicitSolver::solveConstraints(sofa::simulation::common::MechanicalOperations* mop, core::MultiVecDerivId acc)
312+
void EulerExplicitSolver::solveConstraints(sofa::simulation::common::MappingGraphMechanicalOperations* mop, core::MultiVecDerivId acc)
313313
{
314314
SCOPED_TIMER("solveConstraint");
315315

316316
// Calls "solveConstraint" method of every ConstraintSolver objects found in the current context tree.
317317
mop->solveConstraint(acc, core::ConstraintOrder::ACC);
318318
}
319319

320-
void EulerExplicitSolver::assembleSystemMatrix(sofa::simulation::common::MechanicalOperations* mop) const
320+
void EulerExplicitSolver::assembleSystemMatrix(sofa::simulation::common::MappingGraphMechanicalOperations* mop) const
321321
{
322322
SCOPED_TIMER("MBKBuild");
323323

@@ -342,52 +342,9 @@ void EulerExplicitSolver::solveSystem(core::MultiVecDerivId solution, core::Mult
342342
l_linearSolver->getLinearSystem()->dispatchSystemSolution(solution);
343343
}
344344

345-
class MappedMassVisitor final : public simulation::BaseMechanicalVisitor
346-
{
347-
public:
348-
MappedMassVisitor(const sofa::core::ExecParams* params, sofa::simulation::MappingGraph* mappingGraph)
349-
: BaseMechanicalVisitor(params), m_mappingGraph(mappingGraph)
350-
{}
351-
352-
Result fwdMass(simulation::Node*, sofa::core::behavior::BaseMass* mass) override
353-
{
354-
if (mass && m_mappingGraph)
355-
{
356-
m_hasMappedMass |= m_mappingGraph->hasAnyMappingInput(mass);
357-
}
358-
return Result::RESULT_CONTINUE;
359-
}
360-
361-
[[nodiscard]] bool hasMappedMass() const { return m_hasMappedMass; }
362-
363-
private:
364-
sofa::simulation::MappingGraph* m_mappingGraph { nullptr };
365-
bool m_hasMappedMass { false };
366-
};
367-
368-
class AllOfMassesAreDiagonalVisitor final : public simulation::BaseMechanicalVisitor
369-
{
370-
public:
371-
using simulation::BaseMechanicalVisitor::BaseMechanicalVisitor;
372-
Result fwdMass(simulation::Node*, sofa::core::behavior::BaseMass* mass) override
373-
{
374-
if (mass)
375-
{
376-
m_allMassesAreDiagonal &= mass->isDiagonal();
377-
}
378-
return Result::RESULT_CONTINUE;
379-
}
380-
381-
[[nodiscard]] bool areAllMassesAreDiagonal() const { return m_allMassesAreDiagonal; }
382-
383-
private:
384-
bool m_allMassesAreDiagonal { true };
385-
};
386-
387-
bool EulerExplicitSolver::isMassMatrixTriviallyInvertible(const core::ExecParams* params)
345+
bool EulerExplicitSolver::isMassMatrixTriviallyInvertible(const core::ExecParams* params) const
388346
{
389-
sofa::simulation::MappingGraph mappingGraph;
390-
mappingGraph.build(params, this->getContext());
347+
SOFA_UNUSED(params);
391348

392349
// To achieve a diagonal global mass matrix in this system:
393350
// 1) Each individual mass matrix must itself be diagonal.
@@ -397,15 +354,23 @@ bool EulerExplicitSolver::isMassMatrixTriviallyInvertible(const core::ExecParams
397354
// we identify a mapped mass, we cannot guarantee the global mass matrix will remain diagonal.
398355
// Moreover, computing the inverse of a mapped mass would require a complex API. Therefore, this
399356
// case is not supported without assembling the global mass matrix.
400-
MappedMassVisitor mappedMassVisitor(params, &mappingGraph);
401-
mappedMassVisitor.execute(this->getContext());
402-
if (mappedMassVisitor.hasMappedMass())
357+
bool hasMappedMass = false;
358+
m_mappingGraph.algorithms.traverseComponentGroups_([&hasMappedMass](const sofa::core::behavior::BaseMass&)
359+
{
360+
hasMappedMass = true;
361+
}, simulation::VisitorApplication::ONLY_MAPPED_NODES);
362+
if (hasMappedMass)
363+
{
403364
return false;
365+
}
404366

405367
// At this stage, we know that we don't have any mapped mass. We can check if they are all diagonal.
406-
AllOfMassesAreDiagonalVisitor allOfMassesAreDiagonalVisitor(params);
407-
allOfMassesAreDiagonalVisitor.execute(this->getContext());
408-
return allOfMassesAreDiagonalVisitor.areAllMassesAreDiagonal();
368+
bool areAllMassesDiagonal = true;
369+
m_mappingGraph.algorithms.traverseComponentGroups_([&areAllMassesDiagonal](const sofa::core::behavior::BaseMass& mass)
370+
{
371+
areAllMassesDiagonal &= mass.isDiagonal();
372+
});
373+
return areAllMassesDiagonal;
409374
}
410375

411376
} // namespace sofa::component::odesolver::forward

Sofa/Component/ODESolver/Forward/src/sofa/component/odesolver/forward/EulerExplicitSolver.h

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,11 @@
2525
#include <sofa/core/behavior/OdeSolver.h>
2626
#include <sofa/core/behavior/LinearSolver.h>
2727
#include <sofa/core/behavior/MultiVec.h>
28+
#include <sofa/simulation/MappingGraph.h>
2829

2930
namespace sofa::simulation::common
3031
{
31-
class MechanicalOperations;
32+
class MappingGraphMechanicalOperations;
3233
class VectorOperations;
3334
}
3435

@@ -96,35 +97,38 @@ class SOFA_COMPONENT_ODESOLVER_FORWARD_API EulerExplicitSolver : public sofa::co
9697
/// Update state variable (new position and velocity) based on the computed acceleration
9798
/// The update takes constraints into account
9899
void updateState(sofa::simulation::common::VectorOperations* vop,
99-
sofa::simulation::common::MechanicalOperations* mop,
100+
sofa::simulation::common::MappingGraphMechanicalOperations* mop,
100101
sofa::core::MultiVecCoordId xResult,
101102
sofa::core::MultiVecDerivId vResult,
102103
const sofa::core::behavior::MultiVecDeriv& acc,
103104
SReal dt) const;
104105

105106
/// Gravity times time step size is added to the velocity for some masses
106107
/// v += g * dt
107-
static void addSeparateGravity(sofa::simulation::common::MechanicalOperations* mop, SReal dt, core::MultiVecDerivId v);
108+
static void addSeparateGravity(sofa::simulation::common::MappingGraphMechanicalOperations* mop, SReal dt, core::MultiVecDerivId v);
108109

109110
/// Assemble the force vector (right-hand side of the equation)
110-
static void computeForce(sofa::simulation::common::MechanicalOperations* mop, core::MultiVecDerivId f);
111+
void computeForce(sofa::simulation::common::MappingGraphMechanicalOperations* mop, core::MultiVecDerivId f) const;
111112

112113
/// Compute the acceleration from the force and the inverse of the mass
113114
/// acc = M^-1 * f
114-
static void computeAcceleration(sofa::simulation::common::MechanicalOperations* mop,
115+
static void computeAcceleration(sofa::simulation::common::MappingGraphMechanicalOperations* mop,
115116
core::MultiVecDerivId acc,
116117
core::ConstMultiVecDerivId f);
117118

118119
/// Apply projective constraints, such as FixedProjectiveConstraint
119-
static void projectResponse(sofa::simulation::common::MechanicalOperations* mop, core::MultiVecDerivId vecId);
120+
void projectResponse(sofa::simulation::common::MappingGraphMechanicalOperations* mop, core::MultiVecDerivId vecId) const;
120121

121-
static void solveConstraints(sofa::simulation::common::MechanicalOperations* mop, core::MultiVecDerivId acc);
122+
static void solveConstraints(sofa::simulation::common::MappingGraphMechanicalOperations* mop, core::MultiVecDerivId acc);
122123

123-
void assembleSystemMatrix(sofa::simulation::common::MechanicalOperations* mop) const;
124+
void assembleSystemMatrix(sofa::simulation::common::MappingGraphMechanicalOperations* mop) const;
124125

125126
void solveSystem(core::MultiVecDerivId solution, core::MultiVecDerivId rhs) const;
126127

127-
bool isMassMatrixTriviallyInvertible(const core::ExecParams* params);
128+
bool isMassMatrixTriviallyInvertible(const core::ExecParams* params) const;
129+
130+
131+
simulation::MappingGraph m_mappingGraph;
128132
};
129133

130134
} // namespace sofa::component::odesolver::forward

Sofa/framework/Simulation/Core/CMakeLists.txt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ set(HEADER_FILES
6767
${SRC_ROOT}/SceneCheckRegistry.h
6868
${SRC_ROOT}/SceneCheckMainRegistry.h
6969
${SRC_ROOT}/MappingGraph.h
70+
${SRC_ROOT}/MappingGraphMechanicalOperations.h
7071

7172
${SRC_ROOT}/events/BuildConstraintSystemEndEvent.h
7273
${SRC_ROOT}/events/SimulationInitDoneEvent.h
@@ -76,6 +77,15 @@ set(HEADER_FILES
7677
${SRC_ROOT}/events/SimulationStopEvent.h
7778
${SRC_ROOT}/events/SolveConstraintSystemEndEvent.h
7879

80+
${SRC_ROOT}/mappinggraph/BaseMappingGraphNode.h
81+
${SRC_ROOT}/mappinggraph/CallableVisitor.h
82+
${SRC_ROOT}/mappinggraph/ComponentGroupMappingGraphNode.h
83+
${SRC_ROOT}/mappinggraph/ExportDot.h
84+
${SRC_ROOT}/mappinggraph/MappingGraphAlgorithms.h
85+
${SRC_ROOT}/mappinggraph/MappingGraphNode.h
86+
${SRC_ROOT}/mappinggraph/MappingGraphVisitor.h
87+
${SRC_ROOT}/mappinggraph/VisitorApplication.h
88+
7989
${SRC_ROOT}/mechanicalvisitor/MechanicalAccFromFVisitor.h
8090
${SRC_ROOT}/mechanicalvisitor/MechanicalAccumulateJacobian.h
8191
${SRC_ROOT}/mechanicalvisitor/MechanicalAccumulateJacobian.h
@@ -169,6 +179,7 @@ set(SOURCE_FILES
169179
${SRC_ROOT}/IntegrateBeginEvent.cpp
170180
${SRC_ROOT}/IntegrateEndEvent.cpp
171181
${SRC_ROOT}/MappingGraph.cpp
182+
${SRC_ROOT}/MappingGraphMechanicalOperations.cpp
172183
${SRC_ROOT}/MechanicalOperations.cpp
173184
${SRC_ROOT}/MechanicalVPrintVisitor.cpp
174185
${SRC_ROOT}/MechanicalVisitor.cpp
@@ -213,6 +224,11 @@ set(SOURCE_FILES
213224
${SRC_ROOT}/events/SimulationStopEvent.cpp
214225
${SRC_ROOT}/events/SolveConstraintSystemEndEvent.cpp
215226

227+
${SRC_ROOT}/mappinggraph/BaseMappingGraphNode.cpp
228+
${SRC_ROOT}/mappinggraph/ExportDot.cpp
229+
${SRC_ROOT}/mappinggraph/MappingGraphAlgorithms.cpp
230+
${SRC_ROOT}/mappinggraph/MappingGraphVisitor.cpp
231+
216232
${SRC_ROOT}/mechanicalvisitor/MechanicalAccFromFVisitor.cpp
217233
${SRC_ROOT}/mechanicalvisitor/MechanicalAccumulateJacobian.cpp
218234
${SRC_ROOT}/mechanicalvisitor/MechanicalAccumulateJacobian.cpp

0 commit comments

Comments
 (0)