Dynamic Distributed Octree Mesh Example
The code for this example is located in Examples/Octree
Brief
This example creates distributed octree mesh with dynamical modification.
Description
Example contains the grid, which can refine and coarse by some user defined rule.
This example may run in both serial and parallel modes with NP
processes. For parallel run the dynamic load balancing is used.
The main feature of this example is user-defined function, which determines how grid should split and unite. In this example, grid refines around mouse cursor. User should define the function
int cell_should_split(struct grid * g, Cell cell, int level)
which returns 1 if this cell must split to 8 children cells. In addition, user should define the function
int cell_should_unite(struct grid * g, Cell cell)
which returns 1 if cell must unite with 7 neighbors.
After that user must create "struct grid thegrid" object and makes next assignments
thegrid.cell_should_split = cell_should_split;
thegrid.cell_should_unite = cell_should_unite;
Main function of Octree is gridAMR
.
This function makes all changes with the grid.
First it's check all cells to unite, next check to split.
Example contains the graphic representation of it's workflow.
User must install and configure the OpenGL
library.
Arguments
Run with no arguments produces a brief help of example arguments and hotkeys available:
$ ./Octree
Command arguments:
-n=10x10x1 - grid size
-r=0.01 - refine radius
-l=2 - refine level
Hotkeys:
Space - refine grid around mouse cursor
f - dump grid to file (see grids folder)
x - redistribute grid
as well as the run of the example with the specified default set of parameters.
Running example
First go to the Octree folder
$ cd Examples/Octree
Single process run:
Example runs with following command:
$ ./Octree
In this case example runs on single process and all cells will locate on one process.
User can use 'spacebar' key to calls gridAMR
function, which changes the grid.
Parallel processes run:
User can use mpi to run distribute version of example:
$ mpirun -np 3 ./Octree.
User must activate USE_MPI
key in cmake
configuration.
In this case grid splits to NP
parts.
Each part located on separate process. Graphic representation draws each part with unique color.
Before redrawing, example transfers information about grid from all processes (slaves) to one process (master).
After that master can redraw the grid.
User still use 'spacebar' key to calls gridAMR
.
But in this case user can use 'x' key to make redistribution of grid. User can adjust redistribution settings.