Skip to content

DiagonalMass

This component belongs to the category of Masses. In the dynamic equation (see Physics integration page), the mass density results from the first derivative in time of the momentum term. Like the MeshMatrixMass, the DiagonalMass computes the integral of this mass density over the volume of the object geometry. To do so and for any given topology (edges, triangles, quads, tetrahedra or hexahedra), the DiagonalMass integrates the mass density inside each elements and sums the mass matrix \(\mathbf{M}\) in the system matrix \(\mathbf{A}\).

However, the DiagonalMass makes a strong simplification: it considers the mass matrix \(\mathbf{M}\) as being diagonal. To build this diagonal mass matrix, the DiagonalMass relies on a numerical method called the mass lumping. It consists in summing all mass values of a line on the diagonal. This approach is already implemented in the MeshMatrixMass but the DiagonalMass proposes an optimized version of the mass lumping and extend it to edge topology.

For details on the volume integration, please report to the MeshMatrixMass page. As demonstrated in the MeshMatrixMass page, in case of a topology using linear tetrahedra, the diagonal mass matrix corresponds to:

\[ \mathbf{M}\dot{v}=\sum_{e=0}^E \frac{\rho V_e}{4}\begin{bmatrix}1&0&0&0\\&1&0&0\\&0&1&0\\&0&0&1\\ \end{bmatrix}\begin{bmatrix}\dot{v}_1\\ \dot{v}_2\\ \dot{v}_3\\ \dot{v}_4\\ \end{bmatrix} \]

By making the matrix diagonal (i.e. removing extra-diagonal terms), the lumping method removes the connectivity (neighborhood) information from the matrix. Due to this numerical approximation, the accuracy of the integration is decreased compared to the MeshMatrixMass integration. It is therefore advised to use the DiagonalMass carefully.

API

Depending on the type of LinearSolver used:

  • for iterative solvers, the result of the multiplication between the mass matrix \(\mathbf{M}\) and an approximated solution is computed by the function:
template <class DataTypes, class MassType>
void DiagonalMass<DataTypes, MassType>::addMDx(const core::MechanicalParams* /*mparams*/, DataVecDeriv& res, const DataVecDeriv& dx, SReal factor)
{
    const MassVector &masses= d_vertexMass.getValue();
    helper::WriteAccessor< DataVecDeriv > _res = res;
    helper::ReadAccessor< DataVecDeriv > _dx = dx;

    size_t n = masses.size();

    for (size_t i=0; i<n; i++)
    {
        _res[i] += (_dx[i] * masses[i]) * (Real)factor;
    }
}
  • for direct solvers, the mass matrix \(\mathbf{M}\) is built by the function:
template <class DataTypes, class MassType>
void DiagonalMass<DataTypes, MassType>::addMToMatrix(const core::MechanicalParams *mparams, const sofa::core::behavior::MultiMatrixAccessor* matrix)
{
    const MassVector &masses= d_vertexMass.getValue();
    const int N = defaulttype::DataTypeInfo<Deriv>::size();
    AddMToMatrixFunctor<Deriv,MassType> calc;
    sofa::core::behavior::MultiMatrixAccessor::MatrixRef r = matrix->getMatrix(this->mstate);
    Real mFactor = (Real)mparams->mFactorIncludingRayleighDamping(this->rayleighMass.getValue());
    for (unsigned int i=0; i<masses.size(); i++)
        calc(r.matrix, masses[i], r.offset + N*i, mFactor);
}

Usage

The DiagonalMass requires a MechanicalObject to store the degrees of freedom associated to the nodes, as well as a Topology. An integration scheme and a solver are also necessary to solve the linear system at each time step.

All topologies are handled by the DiagonalMass, namely: edges, triangles, quads, tetrahedra or hexahedra.

Define a specific mass for each particle

Rigid2d,Rigid2d

Templates:

  • Rigid2d,Rigid2d

Target: Sofa.Component.Mass

namespace: sofa::component::mass

parents:

  • Mass

Data

Name Description Default value
name object name unnamed
printLog if true, emits extra messages at runtime. 0
tags list of the subsets the objet belongs to
bbox this object bounding box
componentState The state of the component among (Dirty, Valid, Undefined, Loading, Invalid). Undefined
listening if true, handle the events, otherwise ignore the events 0
rayleighStiffness Rayleigh damping - stiffness matrix coefficient 0
separateGravity add separately gravity to velocity computation 0
rayleighMass Rayleigh damping - mass matrix coefficient 0
vertexMass Specify a vector giving the mass of each vertex. If unspecified or wrongly set, the massDensity or totalMass information is used.
massDensity Specify one single real and positive value for the mass density. If unspecified or wrongly set, the totalMass information is used. 1
totalMass Specify the total mass resulting from all particles. If unspecified or wrongly set, the default value is used: totalMass = 1.0 1
computeMassOnRest If true, the mass of every element is computed based on the rest position rather than the position 1
filename Xsp3.0 file to specify the mass parameters
Visualization
showGravityCenter Display the center of gravity of the system 0
showAxisSizeFactor Factor length of the axis displayed (only used for rigids) 1
Name Description Destination type name
context Graph Node containing this object (or BaseContext::getDefault() if no graph is used) BaseContext
slaves Sub-objects used internally by this object BaseObject
master nullptr for regular objects, or master object for which this object is one sub-objects BaseObject
mechanicalStates List of mechanical states to which this component is associated BaseMechanicalState
mstate MechanicalState used by this component MechanicalState<Rigid2d>
topology link to the topology container BaseMeshTopology
geometryState link to the MechanicalObject associated with the geometry MechanicalState<Rigid2d>

Rigid2d,Rigid3d

Templates:

  • Rigid2d,Rigid3d

Target: Sofa.Component.Mass

namespace: sofa::component::mass

parents:

  • Mass

Data

Name Description Default value
name object name unnamed
printLog if true, emits extra messages at runtime. 0
tags list of the subsets the objet belongs to
bbox this object bounding box
componentState The state of the component among (Dirty, Valid, Undefined, Loading, Invalid). Undefined
listening if true, handle the events, otherwise ignore the events 0
rayleighStiffness Rayleigh damping - stiffness matrix coefficient 0
separateGravity add separately gravity to velocity computation 0
rayleighMass Rayleigh damping - mass matrix coefficient 0
vertexMass Specify a vector giving the mass of each vertex. If unspecified or wrongly set, the massDensity or totalMass information is used.
massDensity Specify one single real and positive value for the mass density. If unspecified or wrongly set, the totalMass information is used. 1
totalMass Specify the total mass resulting from all particles. If unspecified or wrongly set, the default value is used: totalMass = 1.0 1
computeMassOnRest If true, the mass of every element is computed based on the rest position rather than the position 1
filename Xsp3.0 file to specify the mass parameters
Visualization
showGravityCenter Display the center of gravity of the system 0
showAxisSizeFactor Factor length of the axis displayed (only used for rigids) 1
Name Description Destination type name
context Graph Node containing this object (or BaseContext::getDefault() if no graph is used) BaseContext
slaves Sub-objects used internally by this object BaseObject
master nullptr for regular objects, or master object for which this object is one sub-objects BaseObject
mechanicalStates List of mechanical states to which this component is associated BaseMechanicalState
mstate MechanicalState used by this component MechanicalState<Rigid2d>
topology link to the topology container BaseMeshTopology
geometryState link to the MechanicalObject associated with the geometry MechanicalState<Rigid3d>

Rigid3d,Rigid3d

Templates:

  • Rigid3d,Rigid3d

Target: Sofa.Component.Mass

namespace: sofa::component::mass

parents:

  • Mass

Data

Name Description Default value
name object name unnamed
printLog if true, emits extra messages at runtime. 0
tags list of the subsets the objet belongs to
bbox this object bounding box
componentState The state of the component among (Dirty, Valid, Undefined, Loading, Invalid). Undefined
listening if true, handle the events, otherwise ignore the events 0
rayleighStiffness Rayleigh damping - stiffness matrix coefficient 0
separateGravity add separately gravity to velocity computation 0
rayleighMass Rayleigh damping - mass matrix coefficient 0
vertexMass Specify a vector giving the mass of each vertex. If unspecified or wrongly set, the massDensity or totalMass information is used.
massDensity Specify one single real and positive value for the mass density. If unspecified or wrongly set, the totalMass information is used. 1
totalMass Specify the total mass resulting from all particles. If unspecified or wrongly set, the default value is used: totalMass = 1.0 1
computeMassOnRest If true, the mass of every element is computed based on the rest position rather than the position 1
filename Xsp3.0 file to specify the mass parameters
Visualization
showGravityCenter Display the center of gravity of the system 0
showAxisSizeFactor Factor length of the axis displayed (only used for rigids) 1
Name Description Destination type name
context Graph Node containing this object (or BaseContext::getDefault() if no graph is used) BaseContext
slaves Sub-objects used internally by this object BaseObject
master nullptr for regular objects, or master object for which this object is one sub-objects BaseObject
mechanicalStates List of mechanical states to which this component is associated BaseMechanicalState
mstate MechanicalState used by this component MechanicalState<Rigid3d>
topology link to the topology container BaseMeshTopology
geometryState link to the MechanicalObject associated with the geometry MechanicalState<Rigid3d>

Vec1d,Vec1d

Templates:

  • Vec1d,Vec1d

Target: Sofa.Component.Mass

namespace: sofa::component::mass

parents:

  • Mass

Data

Name Description Default value
name object name unnamed
printLog if true, emits extra messages at runtime. 0
tags list of the subsets the objet belongs to
bbox this object bounding box
componentState The state of the component among (Dirty, Valid, Undefined, Loading, Invalid). Undefined
listening if true, handle the events, otherwise ignore the events 0
rayleighStiffness Rayleigh damping - stiffness matrix coefficient 0
separateGravity add separately gravity to velocity computation 0
rayleighMass Rayleigh damping - mass matrix coefficient 0
vertexMass Specify a vector giving the mass of each vertex. If unspecified or wrongly set, the massDensity or totalMass information is used.
massDensity Specify one single real and positive value for the mass density. If unspecified or wrongly set, the totalMass information is used. 1
totalMass Specify the total mass resulting from all particles. If unspecified or wrongly set, the default value is used: totalMass = 1.0 1
computeMassOnRest If true, the mass of every element is computed based on the rest position rather than the position 1
filename Xsp3.0 file to specify the mass parameters
Visualization
showGravityCenter Display the center of gravity of the system 0
showAxisSizeFactor Factor length of the axis displayed (only used for rigids) 1
Name Description Destination type name
context Graph Node containing this object (or BaseContext::getDefault() if no graph is used) BaseContext
slaves Sub-objects used internally by this object BaseObject
master nullptr for regular objects, or master object for which this object is one sub-objects BaseObject
mechanicalStates List of mechanical states to which this component is associated BaseMechanicalState
mstate MechanicalState used by this component MechanicalState<Vec1d>
topology link to the topology container BaseMeshTopology
geometryState link to the MechanicalObject associated with the geometry MechanicalState<Vec1d>

Vec1d,Vec2d

Templates:

  • Vec1d,Vec2d

Target: Sofa.Component.Mass

namespace: sofa::component::mass

parents:

  • Mass

Data

Name Description Default value
name object name unnamed
printLog if true, emits extra messages at runtime. 0
tags list of the subsets the objet belongs to
bbox this object bounding box
componentState The state of the component among (Dirty, Valid, Undefined, Loading, Invalid). Undefined
listening if true, handle the events, otherwise ignore the events 0
rayleighStiffness Rayleigh damping - stiffness matrix coefficient 0
separateGravity add separately gravity to velocity computation 0
rayleighMass Rayleigh damping - mass matrix coefficient 0
vertexMass Specify a vector giving the mass of each vertex. If unspecified or wrongly set, the massDensity or totalMass information is used.
massDensity Specify one single real and positive value for the mass density. If unspecified or wrongly set, the totalMass information is used. 1
totalMass Specify the total mass resulting from all particles. If unspecified or wrongly set, the default value is used: totalMass = 1.0 1
computeMassOnRest If true, the mass of every element is computed based on the rest position rather than the position 1
filename Xsp3.0 file to specify the mass parameters
Visualization
showGravityCenter Display the center of gravity of the system 0
showAxisSizeFactor Factor length of the axis displayed (only used for rigids) 1
Name Description Destination type name
context Graph Node containing this object (or BaseContext::getDefault() if no graph is used) BaseContext
slaves Sub-objects used internally by this object BaseObject
master nullptr for regular objects, or master object for which this object is one sub-objects BaseObject
mechanicalStates List of mechanical states to which this component is associated BaseMechanicalState
mstate MechanicalState used by this component MechanicalState<Vec1d>
topology link to the topology container BaseMeshTopology
geometryState link to the MechanicalObject associated with the geometry MechanicalState<Vec2d>

Vec1d,Vec3d

Templates:

  • Vec1d,Vec3d

Target: Sofa.Component.Mass

namespace: sofa::component::mass

parents:

  • Mass

Data

Name Description Default value
name object name unnamed
printLog if true, emits extra messages at runtime. 0
tags list of the subsets the objet belongs to
bbox this object bounding box
componentState The state of the component among (Dirty, Valid, Undefined, Loading, Invalid). Undefined
listening if true, handle the events, otherwise ignore the events 0
rayleighStiffness Rayleigh damping - stiffness matrix coefficient 0
separateGravity add separately gravity to velocity computation 0
rayleighMass Rayleigh damping - mass matrix coefficient 0
vertexMass Specify a vector giving the mass of each vertex. If unspecified or wrongly set, the massDensity or totalMass information is used.
massDensity Specify one single real and positive value for the mass density. If unspecified or wrongly set, the totalMass information is used. 1
totalMass Specify the total mass resulting from all particles. If unspecified or wrongly set, the default value is used: totalMass = 1.0 1
computeMassOnRest If true, the mass of every element is computed based on the rest position rather than the position 1
filename Xsp3.0 file to specify the mass parameters
Visualization
showGravityCenter Display the center of gravity of the system 0
showAxisSizeFactor Factor length of the axis displayed (only used for rigids) 1
Name Description Destination type name
context Graph Node containing this object (or BaseContext::getDefault() if no graph is used) BaseContext
slaves Sub-objects used internally by this object BaseObject
master nullptr for regular objects, or master object for which this object is one sub-objects BaseObject
mechanicalStates List of mechanical states to which this component is associated BaseMechanicalState
mstate MechanicalState used by this component MechanicalState<Vec1d>
topology link to the topology container BaseMeshTopology
geometryState link to the MechanicalObject associated with the geometry MechanicalState<Vec3d>

Vec2d,Vec3d

Templates:

  • Vec2d,Vec3d

Target: Sofa.Component.Mass

namespace: sofa::component::mass

parents:

  • Mass

Data

Name Description Default value
name object name unnamed
printLog if true, emits extra messages at runtime. 0
tags list of the subsets the objet belongs to
bbox this object bounding box
componentState The state of the component among (Dirty, Valid, Undefined, Loading, Invalid). Undefined
listening if true, handle the events, otherwise ignore the events 0
rayleighStiffness Rayleigh damping - stiffness matrix coefficient 0
separateGravity add separately gravity to velocity computation 0
rayleighMass Rayleigh damping - mass matrix coefficient 0
vertexMass Specify a vector giving the mass of each vertex. If unspecified or wrongly set, the massDensity or totalMass information is used.
massDensity Specify one single real and positive value for the mass density. If unspecified or wrongly set, the totalMass information is used. 1
totalMass Specify the total mass resulting from all particles. If unspecified or wrongly set, the default value is used: totalMass = 1.0 1
computeMassOnRest If true, the mass of every element is computed based on the rest position rather than the position 1
filename Xsp3.0 file to specify the mass parameters
Visualization
showGravityCenter Display the center of gravity of the system 0
showAxisSizeFactor Factor length of the axis displayed (only used for rigids) 1
Name Description Destination type name
context Graph Node containing this object (or BaseContext::getDefault() if no graph is used) BaseContext
slaves Sub-objects used internally by this object BaseObject
master nullptr for regular objects, or master object for which this object is one sub-objects BaseObject
mechanicalStates List of mechanical states to which this component is associated BaseMechanicalState
mstate MechanicalState used by this component MechanicalState<Vec2d>
topology link to the topology container BaseMeshTopology
geometryState link to the MechanicalObject associated with the geometry MechanicalState<Vec3d>

Vec3d,Vec3d

Templates:

  • Vec3d,Vec3d

Target: Sofa.Component.Mass

namespace: sofa::component::mass

parents:

  • Mass

Data

Name Description Default value
name object name unnamed
printLog if true, emits extra messages at runtime. 0
tags list of the subsets the objet belongs to
bbox this object bounding box
componentState The state of the component among (Dirty, Valid, Undefined, Loading, Invalid). Undefined
listening if true, handle the events, otherwise ignore the events 0
rayleighStiffness Rayleigh damping - stiffness matrix coefficient 0
separateGravity add separately gravity to velocity computation 0
rayleighMass Rayleigh damping - mass matrix coefficient 0
vertexMass Specify a vector giving the mass of each vertex. If unspecified or wrongly set, the massDensity or totalMass information is used.
massDensity Specify one single real and positive value for the mass density. If unspecified or wrongly set, the totalMass information is used. 1
totalMass Specify the total mass resulting from all particles. If unspecified or wrongly set, the default value is used: totalMass = 1.0 1
computeMassOnRest If true, the mass of every element is computed based on the rest position rather than the position 1
filename Xsp3.0 file to specify the mass parameters
Visualization
showGravityCenter Display the center of gravity of the system 0
showAxisSizeFactor Factor length of the axis displayed (only used for rigids) 1
Name Description Destination type name
context Graph Node containing this object (or BaseContext::getDefault() if no graph is used) BaseContext
slaves Sub-objects used internally by this object BaseObject
master nullptr for regular objects, or master object for which this object is one sub-objects BaseObject
mechanicalStates List of mechanical states to which this component is associated BaseMechanicalState
mstate MechanicalState used by this component MechanicalState<Vec3d>
topology link to the topology container BaseMeshTopology
geometryState link to the MechanicalObject associated with the geometry MechanicalState<Vec3d>

Examples

DiagonalMass.scn

<?xml version="1.0" ?>
<Node name="root" dt="0.005">
    <RequiredPlugin name="Sofa.Component.Collision.Detection.Algorithm"/> <!-- Needed to use components [BVHNarrowPhase BruteForceBroadPhase CollisionPipeline] -->
    <RequiredPlugin name="Sofa.Component.Collision.Detection.Intersection"/> <!-- Needed to use components [DiscreteIntersection] -->
    <RequiredPlugin name="Sofa.Component.Collision.Geometry"/> <!-- Needed to use components [SphereCollisionModel] -->
    <RequiredPlugin name="Sofa.Component.Collision.Response.Contact"/> <!-- Needed to use components [CollisionResponse] -->
    <RequiredPlugin name="Sofa.Component.Constraint.Projective"/> <!-- Needed to use components [FixedProjectiveConstraint] -->
    <RequiredPlugin name="Sofa.Component.IO.Mesh"/> <!-- Needed to use components [MeshGmshLoader MeshOBJLoader SphereLoader] -->
    <RequiredPlugin name="Sofa.Component.LinearSolver.Iterative"/> <!-- Needed to use components [CGLinearSolver] -->
    <RequiredPlugin name="Sofa.Component.Mapping.Linear"/> <!-- Needed to use components [BarycentricMapping] -->
    <RequiredPlugin name="Sofa.Component.Mass"/> <!-- Needed to use components [DiagonalMass] -->
    <RequiredPlugin name="Sofa.Component.ODESolver.Backward"/> <!-- Needed to use components [EulerImplicitSolver] -->
    <RequiredPlugin name="Sofa.Component.SolidMechanics.FEM.Elastic"/> <!-- Needed to use components [TetrahedralCorotationalFEMForceField] -->
    <RequiredPlugin name="Sofa.Component.StateContainer"/> <!-- Needed to use components [MechanicalObject] -->
    <RequiredPlugin name="Sofa.Component.Topology.Container.Dynamic"/> <!-- Needed to use components [TetrahedronSetGeometryAlgorithms TetrahedronSetTopologyContainer] -->
    <RequiredPlugin name="Sofa.GL.Component.Rendering3D"/> <!-- Needed to use components [OglModel] -->

    <CollisionPipeline verbose="0" name="CollisionPipeline" />
    <BruteForceBroadPhase/>
    <BVHNarrowPhase/>
    <CollisionResponse response="PenalityContactForceField" name="collision response" />
    <DiscreteIntersection />
    <DefaultAnimationLoop/>

    <MeshGmshLoader name="loader" filename="mesh/liver.msh" />
    <MeshOBJLoader name="meshLoader_0" filename="mesh/liver-smooth.obj" handleSeams="1" />

    <Node name="Liver" depend="topo dofs">
        <EulerImplicitSolver name="integration scheme" />
        <CGLinearSolver name="linear solver" iterations="1000" tolerance="1e-9" threshold="1e-9"/>
        <MechanicalObject name="dofs" src="@../loader" />
        <!-- Container for the tetrahedra-->
        <TetrahedronSetTopologyContainer name="TetraTopo" src="@../loader" />
        <TetrahedronSetGeometryAlgorithms name="GeomAlgo" />
        <DiagonalMass totalMass="60" name="diagonalMass" />
        <TetrahedralCorotationalFEMForceField template="Vec3" name="FEM" method="large" poissonRatio="0.45" youngModulus="5000" />
        <FixedProjectiveConstraint name="FixedProjectiveConstraint" indices="3 39 64" />

        <Node name="Visu">
            <OglModel name="VisualModel" src="@../../meshLoader_0" color="red" />
            <BarycentricMapping name="VisualMapping" input="@../dofs" output="@VisualModel" />
        </Node>
        <Node name="Surf">
            <SphereLoader filename="mesh/liver.sph" />
            <MechanicalObject name="spheres" position="@[-1].position" />
            <SphereCollisionModel name="CollisionModel" listRadius="@[-2].listRadius" />
            <BarycentricMapping name="CollisionMapping" input="@../dofs" output="@spheres" />
        </Node>
    </Node>
</Node>
def createScene(root_node):

   root = root_node.addChild('root', dt="0.005")

   root.addObject('RequiredPlugin', name="Sofa.Component.Collision.Detection.Algorithm")
   root.addObject('RequiredPlugin', name="Sofa.Component.Collision.Detection.Intersection")
   root.addObject('RequiredPlugin', name="Sofa.Component.Collision.Geometry")
   root.addObject('RequiredPlugin', name="Sofa.Component.Collision.Response.Contact")
   root.addObject('RequiredPlugin', name="Sofa.Component.Constraint.Projective")
   root.addObject('RequiredPlugin', name="Sofa.Component.IO.Mesh")
   root.addObject('RequiredPlugin', name="Sofa.Component.LinearSolver.Iterative")
   root.addObject('RequiredPlugin', name="Sofa.Component.Mapping.Linear")
   root.addObject('RequiredPlugin', name="Sofa.Component.Mass")
   root.addObject('RequiredPlugin', name="Sofa.Component.ODESolver.Backward")
   root.addObject('RequiredPlugin', name="Sofa.Component.SolidMechanics.FEM.Elastic")
   root.addObject('RequiredPlugin', name="Sofa.Component.StateContainer")
   root.addObject('RequiredPlugin', name="Sofa.Component.Topology.Container.Dynamic")
   root.addObject('RequiredPlugin', name="Sofa.GL.Component.Rendering3D")
   root.addObject('CollisionPipeline', verbose="0", name="CollisionPipeline")
   root.addObject('BruteForceBroadPhase', )
   root.addObject('BVHNarrowPhase', )
   root.addObject('CollisionResponse', response="PenalityContactForceField", name="collision response")
   root.addObject('DiscreteIntersection', )
   root.addObject('DefaultAnimationLoop', )
   root.addObject('MeshGmshLoader', name="loader", filename="mesh/liver.msh")
   root.addObject('MeshOBJLoader', name="meshLoader_0", filename="mesh/liver-smooth.obj", handleSeams="1")

   liver = root.addChild('Liver', depend="topo dofs")

   liver.addObject('EulerImplicitSolver', name="integration scheme")
   liver.addObject('CGLinearSolver', name="linear solver", iterations="1000", tolerance="1e-9", threshold="1e-9")
   liver.addObject('MechanicalObject', name="dofs", src="@../loader")
   liver.addObject('TetrahedronSetTopologyContainer', name="TetraTopo", src="@../loader")
   liver.addObject('TetrahedronSetGeometryAlgorithms', name="GeomAlgo")
   liver.addObject('DiagonalMass', totalMass="60", name="diagonalMass")
   liver.addObject('TetrahedralCorotationalFEMForceField', template="Vec3", name="FEM", method="large", poissonRatio="0.45", youngModulus="5000")
   liver.addObject('FixedProjectiveConstraint', name="FixedProjectiveConstraint", indices="3 39 64")

   visu = Liver.addChild('Visu')

   visu.addObject('OglModel', name="VisualModel", src="@../../meshLoader_0", color="red")
   visu.addObject('BarycentricMapping', name="VisualMapping", input="@../dofs", output="@VisualModel")

   surf = Liver.addChild('Surf')

   surf.addObject('SphereLoader', filename="mesh/liver.sph")
   surf.addObject('MechanicalObject', name="spheres", position="@[-1].position")
   surf.addObject('SphereCollisionModel', name="CollisionModel", listRadius="@[-2].listRadius")
   surf.addObject('BarycentricMapping', name="CollisionMapping", input="@../dofs", output="@spheres")