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