|  |  |  | # 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. | 
|  |  |  |  |