This part discusses the Chrono FEA module.
Finite elements can be used in Chrono to model flexible parts.
Different types of finite elements are supported.
- solid volume elements like tetrahedrons can be used to model parts with arbitrary geometry, such as metal shapes, plastic molds, biomechanical tissues like muscles, etc.
- surface volume elements like shells can be used to model thin parts, like tires, airbags, etc.
- beam elements can be used to model cables, wires, thin shafts, blades of wind turbines, etc.
For most of these elements we support large displacements. This allows, for instance, the simulation of problems like rubber structures undergoing large deflections, airplane taking complex manouvers in space, blades of wind turbines with large rotations and other geometric non-linearities. Of course linearized small-displacement analysis is supported too, as a subcase.
Detailed documentation on nodes and elements can be found in these pages:
Finite element data structures
Data structures for a FEA model are organized in this way:
One can see that the main ingredients are
- a chrono::fea::ChMesh object that contains elements and nodes
- some nodes, from the classes derived from chrono::fea::ChNodeFEAbase.
- the elements, from the classes derived from chrono::fea::ChElementBase.
Note, however, that one can also use some of the chrono::ChLink objects to constraint nodes to other nodes or to chrono::ChBody objects. Also, some chrono::ChLoad objects like forces, torques, pressures, can be added. In the following example we show the data structures for a case with two elements, a constraint, a load:
In general:
- A mesh is a container for nodes and elements
- Add a ChMesh to the system using ChSystem::Add()
- Multiple meshes are allowed in a single system
- A node has degrees of freedom (xyz, rotations, etc.).
- Add nodes to a mesh using ChMesh::AddNode()
- Look at the list of nodes.
- An element connects N nodes.
- Add elements to a mesh using ChMesh::AddElement()
- Initialize the elements by telling which node are connected with SetNodes()
- Set a material property to the element by using SetMaterial()
- Look at the list of elements.
How to create a FEA model
Creating/Setting up a finite element mesh typically involves the following steps:
- Create the chrono::fea::ChMesh, and add it to a chrono::ChSystem
- Create some nodes
- Create a material for elements, if needed
- Create some elements between nodes
The following example illustrates it.
1) Create a ChMesh
- Create the mesh (do this using std::make_shared, so it will be handled by a shared pointer, and you will not worry about deleting it)
- Add the mesh to a physical system:
2) Create some nodes
- Create nodes, using shared pointers.
- Note: usually node positions are set as parameters in their constructors
- Add nodes to the mesh
- Set node properties, if you need.
- Ex. most node classes provide a way to apply a local force (or even a torque if they have rotational DOFs) by using SetForce() , an easier alternative to using ChLoad classes, if the force is constant.
- Here you may want also to attach an optional local point-mass using SetMass() for the nodes; otherwise the default mass for FEA nodes is zero, as mass is mostly added by finite elements.
3) Create a material
- Create the material, using shared pointers.
- Note that not all elements need a material, for instance ChElementSpring has no material.
- A single material can be shared between multiple elements.
4) Create FEA elements
- Create the elements, using shared pointers.
- Add the elements to the mesh.
- Assign nodes (which you created before) to the element.
- Assign material(s) to the elements.
See also
- whitepapers page Theory and additional information regarding the implementation of finite elements in Chrono
- tutorials Demos and examples
- API documentation The C++ classes and functions of this module.