OpenFPM stand for Open Framework for Particles Mesh simulation. Below we show with a graph the structure of the project.
Each node in the graph is a component, while arrow indicate the dependencies of the components, colored in red there are the components that can be considered like the spine of OpenFPM. The graph itself show the highest level of modularity of OpenFPM project. Below we try introduce each for the component explaining why they exist basically their purpose.
In any good software project, beforehand we must define the design of the program/library, or its modularity at the highest level. The modularity of the software is the capability of the software to have replaceable components, or more in general the capabilities of a software to be changed without affecting other part of the programs. This is a fundamental requirement to have a flexible and maintainable software. Example suppose to have a program that modularize each task (each task is a component). If we did this we can replace the implementation of task A with another implementation more efficient, or with the implementation of the task based on a better external library, without affecting the implementation of the others tasks. It is also clear that this task modularization, bring at the level where one developer can really focus on the implementation/optimization/development of one task without thinking on the implementation of others tasks.
To introduce the OpenFPM modularization we will introduce first the task and than the component inside OpenFPM that implement it.
OpenFPM at most basic level operations manage the Memory: getting some chunk of memory, destroy it, or resize it on any devices or with particular properties. The component inside OpenFPM designed to do such task is devices (Memory). After that we have the capabilities to create memory we have to shape it, or give to them some meaning. More specifically we want to Map complex structures on memory, like a Grid, Vectors, Graph ... The component designed to do such task in OpenFPM is ** data **. While ** data ** implement complex structures on single machine, we would like to have distributed version of such complex structures. The component designed to do such task in OpenFPM is ** pdata **. Here pdata does not directly depend on data, but there is an intra-modularity between them given by Vcluster. Why we need this ? There are several reasons, the first is modularization of the comunication libraries