
\section{Why \sofa ?}
% The creation of geometric models can require complex algorithms for surface extraction, mesh simplification or refinement and volumetric meshing.
Programming interactive physical simulation of rigid and deformable objects requires multiple skills in geometric modeling, computation mechanics, numerical analysis, collision detection, rendering, user interface and haptics feedback, among others. 
It is also challenging from a software engineering standpoint, with the need for computationally efficient algorithms, multi-threading, or the deployment of applications on modern hardware architectures such as the GPU.
The development of complex medical simulations has thus become an increasingly complex task, involving more domains of expertise than a typical research and development team can provide.
The goal of \sofa{} is to address these issues within a highly modular yet efficient framework, to allow researchers and developers to focus on their own domain of expertise, while re-using other expert's contributions. 

\section{The "philosophy" of \sofa}
\sofa{} introduces the concept of multi-model representation to easily build simulations composed of complex anatomical structures.
The pool of simulated objects and algorithms used in a simulation (also called a scene) is described using a hierarchical data structure similar to scene graphs used in graphics libraries. 
Simulated objects are decomposed into collections of independent components, each of them describing one feature of the model, such as state vectors, mass, forces, constraints, topology, integration scheme, and solving process.
As a result, switching from internal forces based on springs to a finite element approach can be done by simply replacing one component with another, all the rest (mass, collision models, time integration, ...) remaining unchanged. Similarly, it is possible to keep the same force model and modify the solver and state vectors in order to compute the model on the GPU instead of the CPU.
 Moreover, the simulation algorithms, embedded in components, can be customized with the same flexibility as the physical models.

In addition to this first level of modularity, it is possible to go one step further and decompose simulated objects into multiple partial models, each optimized for a given type of computation.
Typically, a physical object in \sofa{} is described using three partial models: a mechanical model with mass and constitutive laws, a collision model with contact geometry, and a visual model with detailed geometry and rendering parameters.
Each model can be designed independently of the others, and more complex combinations are possible, for instance for coupling two different physical objects.
During run-time, the models are synchronized using a generic mechanism called \textit{mapping} to propagate forces and displacements. 
The user can interact in real-time with the mechanical models simulated in SOFA, using the mouse but also using other type of input device. Haptic rendering is also supported.
% \SC{This mapping can simply update the position of vertices on the visual model, or transmit forces and velocities between the collision model and mechanical model. In this case the mapping follows the physical principle of the \textit{virtual works}.} \ff{(Mapping trop détaillé ici à mon avis)}

\section{Why should I contribute to \sofa ?}
\sofa{} was first released in 2007~\cite{ACFBPDDG07}. Since then, it has evolved toward a comprehensive, high-performance library used by an increasing number of academics and commercial companies.
The code is open-source and the license is LGPL. 
 You can use this code to build your own medical simulations needs or for other applications. You can also include this code in a commercial product. 
The only requirement is that if you modify the code for a commercial product you need to share this modification with your client.

Moreover, you can build upon SOFA using the plug-in system. Your plug-in can have an other license than LGPL. Consequently there is a considerable freedom for you to use SOFA for your research, your developments or your products !

Finally,  \sofa is also intended for the research community to help the development and the sharing of newer algorithms and models.
So, do not hesitate to share your experience of \sofa, your code and your results with the \sofa community !!!

