Skip to content

MeshMatrixMass

Define a specific mass for each particle Supports GPU-side computations using CUDA

Templates:

  • CudaVec1d,CudaVec1d
  • CudaVec1d,CudaVec2d
  • CudaVec1d,CudaVec3d
  • CudaVec1f,CudaVec1f
  • CudaVec1f,CudaVec2f
  • CudaVec1f,CudaVec3f
  • CudaVec2d,CudaVec2d
  • CudaVec2d,CudaVec3d
  • CudaVec2f,CudaVec2f
  • CudaVec2f,CudaVec3f
  • CudaVec3d,CudaVec3d
  • CudaVec3f,CudaVec3f

Target: SofaCUDA

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
isCompliance Consider the component as a compliance, else as a stiffness 0
rayleighStiffness Rayleigh damping - stiffness matrix coefficient 0
separateGravity add separately gravity to velocity computation 0
rayleighMass Rayleigh damping - mass matrix coefficient 0
massDensity Specify real and strictly positive value(s) for the mass density. If unspecified or wrongly set, the totalMass information is used.
totalMass Specify the total mass resulting from all particles. If unspecified or wrongly set, the default value is used: totalMass = 1.0 1
vertexMass internal values of the particles masses on vertices, supporting topological changes
edgeMass internal values of the particles masses on edges, supporting topological changes
computeMassOnRest If true, the mass of every element is computed based on the rest position rather than the position 0
lumping boolean if you need to use a lumped mass matrix 0
printMass boolean if you want to check the mass conservation 0
graph Graph of the controlled potential
Visualization
showGravityCenter display the center of gravity of the system 0
showAxisSizeFactor factor length of the axis displayed (only used for rigids) 1

Links:

Name Description
context Graph Node containing this object (or BaseContext::getDefault() if no graph is used)
slaves Sub-objects used internally by this object
master nullptr for regular objects, or master object for which this object is one sub-objects
mechanicalStates List of mechanical states to which this component is associated
mstate MechanicalState used by this component
topology link to the topology container
geometryState link to the MechanicalObject associated with the geometry

Examples

Component/Mass/MeshMatrixMass.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 [MeshMatrixMass] -->
    <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.Component.Visual"/> <!-- Needed to use components [VisualStyle] -->
    <RequiredPlugin name="Sofa.GL.Component.Rendering3D"/> <!-- Needed to use components [OglModel] -->

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

    <MeshGmshLoader name="MeshLoader" filename="mesh/liver.msh" />
    <MeshOBJLoader name="LiverSurface" filename="mesh/liver-smooth.obj" />

    <Node name="Liver">
        <EulerImplicitSolver name="integration scheme" />
        <CGLinearSolver name="linear solver" iterations="1000" tolerance="1e-9" threshold="1e-9"/>
        <MechanicalObject name="dofs" src="@../MeshLoader"/>
        <!-- Container for the tetrahedra-->
        <TetrahedronSetTopologyContainer name="TetraTopo" src="@../MeshLoader"/>
        <TetrahedronSetGeometryAlgorithms name="GeomAlgo" />
        <MeshMatrixMass totalMass="60" name="SparseMass" topology="@TetraTopo" />
        <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="@../../LiverSurface" color="cyan"/>
            <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(rootNode):

    root = rootNode.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.Component.Visual")
    root.addObject('RequiredPlugin', name="Sofa.GL.Component.Rendering3D")
    root.addObject('VisualStyle', displayFlags="showBehaviorModels showForceFields")
    root.addObject('DefaultAnimationLoop')
    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('MeshGmshLoader', name="MeshLoader", filename="mesh/liver.msh")
    root.addObject('MeshOBJLoader', name="LiverSurface", filename="mesh/liver-smooth.obj")

    Liver = root.addChild('Liver')
    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="@../MeshLoader")
    Liver.addObject('TetrahedronSetTopologyContainer', name="TetraTopo", src="@../MeshLoader")
    Liver.addObject('TetrahedronSetGeometryAlgorithms', name="GeomAlgo")
    Liver.addObject('MeshMatrixMass', totalMass="60", name="SparseMass", topology="@TetraTopo")
    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="@../../LiverSurface", color="cyan")
    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")