Examples¶
In the /examples
sub directory several C++ and Fortran example
programs are place, as well as example projects. In some cases, where
ALL would be confusing, the library is referred to as libALL.
Projects¶
To show how to integrate our library into your project, there are example CMake and GNU make projects.
CMake¶
In the /examples
directory are two example CMake projects. One uses a
separately installed (or at least compiled) ALL, and the other includes
the library as a subdirectory and builds it along with the main project.
When copying the example projects, make sure the symbolic links are still
resolved. The example programs of the project are just linked from the
examples, with the exception of ALL_test.cpp
. This program is
modified, so different feature flags are used for VTK and Voronoi, to test
external usage of these features. The change happens in the shell script
building the project.
In both cases, if VTK output is enabled, CMake must be able to find it. If
it is not able to by default, or a specific version should be used, set
VTK_DIR to the directory containing VTK’s CMake configuration. For our
test system, which uses VTK 7.1, this is the /lib/cmake/vtk-7.1
subdirectory of the install prefix of VTK.
Package¶
The example project using find_package
is available in
/example/CMakeProject
. The full build steps are visible from
build_all.sh
, which first compiles the library and then the example
project, after setting ALL_DIR
(and VTK_DIR
).
In general, it suffices to just use find_package(ALL 0.9)
in your
project’s CMakeLists.txt
and then link the corresponding executables
against this using target_link_library(YOUR_TARGET PUBLIC ALL:ALL)
.
The libraries targets are exported in the ALL::
namespace. The Fortran
module is then ALL::ALL_fortran
.
Subdirectory¶
This project includes the library directly in the source tree via
add_subdirectory
. To avoid cyclic symbolic links, this version does
not run out of the box, since we need the source tree of the library as a
subdirectory of the project’s directory. So copy the contents of
/example/CMakeProjectSubdir
. The files assume the library to reside in
the subdirectory all
and, if VTK is enabled, the VTK installation
in vtk_bin
. Also remember, that the symbolic links still resolve. Then
you can just run CMake and the project, along with the library, will be
build. This is also referenced in build_all.sh
.
The targets you have to link your executables against are, however, ALL
or ALL_fortran
respectively. The library is only namespaced if using
the aforementioned find_package
method. And some name collisions may
therefore also occur. Using this method causes the library to be
automatically be build, but also to be rebuild every time the build
directory is cleaned.
GNU Make¶
An example of integrating ALL into a traditional GNU Makefile project is
shown in /example/MakefileProject
. A symbolic link to the VTK
installation directory is assumed to exist as vtk_bin
, otherwise the
Makefile must be updated (see VTK_DIR
). It also assumes its directory
in the source tree as relative position to the ALL source directory.
Moving the project needs updating of ALL_SOURCE
. It will automatically
compile ALL using the options provided in LIBALL_CONFIGURE
.
Programs¶
ALL_test
¶
MPI C++ code that generates a particle distribution over the domains. At program start the domains form an orthogonal decomposition of the cubic 3d system. Each domain has the same volume as each other domain. Depending on the cartesian coordinates of the domain in this decomposition, a number of points is created on each domain. The points are then distributed uniformly over the domain. For the number of points a polynomial formula is used to create a non-uniform point distribution. As an estimation of the work load in this program the number of points within a domain was chosen. There is no particle movement included in the current version of the example code, therefore particle communication only takes place due to the shift of domain borders.
The program creates three output files in its basic version:
minmax.dat
- Columns
<iteration count> <W_min/W_avg> <W_max_W_avg> <(W_max-W_min)/(W_max+W_min)>
- Explanation
In order to try to give a comparable metric for the success of the load balancing procedure the relative difference of the minimum and maximum work loads in the system in relation to the average work load of the system are given. The last column gives an indicator for the inequality of work in the system, in a perfectly balanced system, this value should be equal to zero.
stddev.txt
- Columns
<iteration count> <std_dev>
- Explanation
The standard deviation of work load over all domains.
domain_data.dat
- Columns
<rank> <x_min> <x_max> <y_min> <y_max> <z_min> <z_max> <W>
- Explanation
There are two blocks of rows, looking like this, the first block is the starting configuration of the domains, which should be a uniform grid of orthogonal domains. The second block is the configuration after 200 load balancing steps. In each line the MPI rank of the domain and the extension in each cartesian direction is given, as well as the work load (the number of points).
If the library is compiled with VTK support, ALL_test
also creates a
VTK based output of the domains in each iteration step. This output will
be placed in a vtk_outline
sub directory, which is created if it does
not already exist. The resulting output can be visualized with tools like
ParaView or VisIt.
ALL_test_f
and ALL_test_f_obj
¶
The Fortran example provides a more basic version of the test program
ALL_test
, as its main goal is to show the functionality of the Fortran
interface. The code creates a basic uniform orthogonal domain
decomposition and creates an inhomogeneous particle distribution over
these. Only one load balancing step is executed and the program prints
out the domain distribution of the start configuration and of the final
configuration.
ALL_Staggered
and ALL_Staggered_f
¶
These create a very simple load balancing situation with fixed load and domains placed along the z direction. The C++ and Fortran versions are functionally the same, so the differences between the interfaces can be checked.