Fluidix includes over 30 example simulations designed to teach key concepts and provide a starting point for your application.
|
|
How does Fluidix work?
Fluidix is a C++ library and development platform that can be used on its own or integrated with existing code. It uses the nVidia CUDA architecture, which allows massively parallel, low cost GPUs to be used for general purpose applications. Fluidix combines high performance hardware, optimized software algorithms, and an intuitive programming interface to bring powerful simulation design tools to users of all experience levels, providing incredible performance gains over traditional CPU-based simulations.
Key design concepts include:
Key design concepts include:
- Custom Particle Data: Due to the flexibility of C++ templates, particles can have any number of local variables, such as position, velocity, acceleration, density, temperature, pressure, or anything your model calls for.
- Custom Interaction Code: Efficiently execute your custom code in parallel with searches such as “each particle”, “each pair of nearby particles”, or “each particle colliding with a mesh”. You can focus on writing the equations of the model and leave the organizing, searching, and looping to Fluidix.
- Unified Memory: Data transfers are automatically and efficiently synchronized so you can seamlessly switch between the CPU and the GPU at will.
- Dynamic Execution: There is no fixed simulation loop. You can execute any interaction at any time, in any order, allowing interesting simulations which can observe, adjust, and change themselves on the fly.
- Spatial Hashing: Particles and triangle meshes are automatically organized into efficient binary tree structures for highly optimized searching in both uniform and sparse distributions, allowing neighbor searching across particle sets as well as between particles and triangles of a 3D mesh.
- Scalability: Linear performance for very small (less than 10k) and large (over 10 million) particle or triangle counts, making Fluidix useful for real-time interactive systems as well as large scale scientific models.
- 3D Models: Import STL models, raw data, or generate millions of triangles from vertices and edges for use in highly complex, dynamic systems supporting moving, deforming, and fully interactive polygon meshes.
What makes Fluidix different?
Fluidix provides standard capability for dynamic parameters often assumed constant in most models. For example, you can add and remove particles at any time, add and remove links, deform and restructure meshes, change the time-step, change the integration scheme, or change the interactions at any time. You have full control over the process and can creatively implement a new model in an infinite number of ways.
Fluidix uses a binary tree for spatially subdividing sets of particles and triangles, in contrast with more common uniform grid approaches. In either case, performance of a uniform benchmark scales linearly with number of particles, however in Fluidix, the cell size varies dynamically based on local density of particles. This provides much higher performance in sparse systems with regions of high and low density, such as a flowing fluid with non-rectangular boundaries.
Fluidix uses a binary tree for spatially subdividing sets of particles and triangles, in contrast with more common uniform grid approaches. In either case, performance of a uniform benchmark scales linearly with number of particles, however in Fluidix, the cell size varies dynamically based on local density of particles. This provides much higher performance in sparse systems with regions of high and low density, such as a flowing fluid with non-rectangular boundaries.
How do I create a simulation?
Fluidix asks the user to understand their model from a parallel perspective, not to master the underlying mechanisms of GPU-based parallel programming. Implementing a model in Fluidix consists of three major steps:
- Define the data that your simulation will use. Consider the variables that each particle will have, and the variables/arrays that will be global to the entire simulation.
- Define the interactions that will operate on your data. Select from a set of fundamental search methods such as “each particle”, “each pair of particles”, or “each particle that is inside a 3D object”, and write callback-like C code to execute in parallel on the results of each search.
- Define the simulation process. Initialize data, execute interactions, and write output files using a combination of Fluidix API calls and your own code, in any order.