General description
The “SurfacePressureConstraint” component simulates a constant pressure on a surface.
Methods description
Requirement: Constraint resolution method
Definition: Pressure is the amount of force acting per unit of area:
P = F / S
where P is the pressure, F is the normal force and S is the area of surface where the force is applied
Method
We want Jλ to be homogeneous to a force:
J = p × S
For each element e of the surface, we compute the normal and the area of the element ne and Se. We split the product ne × Se to each point of the element by dividing it by nbpe (the number of points in the element). Considering an uniform pressure, J will then be as follows:
J = (∑{e | p1 point of e} ne × Se / nbpe … ∑{e | pi point of e} ne × Se / nbpe … ∑{e | pn point of e} ne × Se / nbpe) T
Thus, each point receives the contributions of each element it is part of. λ then represents the intensity of the pressure.
Example of a pneumatic actuation on an accordion model: (left) Accordion at rest. (middle) Accordion when inflated. (right) Method of pressure distribution on the cavity wall vertices.
How to use the component
To learn how to create a SOFA scene, please refer to the tutorial provided by the SOFA Modeler or this documentation.
To simulate a pressure in a cavity of a three dimensional model, you will need two meshes. The surface of the cavity (in red in the bunny example) and the three dimensional mesh you want to deform with pressure.
#bunny bunny = rootNode.createChild('bunny') (...) #bunny/cavity cavity = bunny.createChild('cavity') cavity.createObject('MeshObjLoader', name='loader', filename=path+'cavity.obj') cavity.createObject('Mesh', src='@loader', name='topo') cavity.createObject('MechanicalObject', name='cavity') cavity.createObject('SurfacePressureConstraint', triangles='@topo.triangles', value='40') cavity.createObject('BarycentricMapping', name='mapping', mapForces='false', mapMasses='false')
An example is provided in the “examples” directory of the plugin.
Data field
Here are described the data fields corresponding to this particular component.
Input data
triangles/quads : List of triangles/quads on which the pressure is applied. If no list is given (i.e no triangles and no quads), the component will fill the two lists with the context topology.
value : Input values corresponding to the actuations imposed by the constraint
valueIndex : Index of the value (in value vector) that we want to impose. If unspecified, the default value is {0}
valueType : pressure or volumeGrowth. In the first case, the constraint will impose the pressure provided in data value[valueIndex]. In the second case, the constraint will impose the volume growth provided in data value[valueIndex].
Output data
intialCavityVolume : Volume of the cavity at initialization. Only consistent if the mesh is closed.
cavityVolume : Volume of the cavity at the end of the time step. Only consistent if the mesh is closed.