Skip to content
Snippets Groups Projects
Commit 7dd825c1 authored by Pietro Incardona's avatar Pietro Incardona
Browse files

Fixing osx PETSC installation

parent b3e80082
No related branches found
No related tags found
No related merge requests found
#include "Vector/vector_dist.hpp"
#include "Decomposition/CartDecomposition.hpp"
/*
* ### WIKI 1 ###
*
* ## Simple example
*
* This example show several basic functionalities of the distributed vector
* This example show several basic functionalities of the distributed vector, A distributed vector is nothing else than
* a set of particles in an N dimensional space
*
* ### WIKI END ###
*
*/
/*
* ### WIKI 2 ###
*
* We define a particle structure it contain 4 scalars one vector with 3 components
* and a tensor of rank 2 3x3
*
* ### WIKI END ###
*
*/
template<typename T> class Particle
{
public:
typedef boost::fusion::vector<T,T[3],T[3][3]> type;
type data;
static const unsigned int s = 0;
static const unsigned int v = 1;
static const unsigned int t = 2;
static const unsigned int max_prop = 3;
};
int main(int argc, char* argv[])
{
//
......@@ -44,65 +20,80 @@ int main(int argc, char* argv[])
// Here we Initialize the library, than we create a uniform random generator between 0 and 1 to to generate particles
// randomly in the domain, we create a Box that define our domain, boundary conditions, and ghost
//
openfpm_init(&argc,&argv);
Vcluster & v_cl = create_vcluster();
typedef Point<2,float> s;
// set the seed
// create the random generator engine
std::srand(v_cl.getProcessUnitID());
std::default_random_engine eg;
std::uniform_real_distribution<float> ud(0.0f, 1.0f);
// initialize the library
openfpm_init(&argc,&argv);
// Here we define our domain a 2D box with internals from 0 to 1.0 for x and y
Box<2,float> domain({0.0,0.0},{1.0,1.0});
// Here we define the boundary conditions of our problem
size_t bc[2]={PERIODIC,PERIODIC};
// extended boundary around the domain, and the processor domain
Ghost<2,float> g(0.01);
//
// ### WIKI 3 ###
//
// Here we are creating a distributed vector defined by the following parameters
//
// * 2 is the Dimensionality of the space where the objects live
// * float is the type used for the spatial coordinate of the particles
// * float,float[3],float[3][3] is the information stored by each particle a scalar float, a vector float[3] and a tensor of rank 2 float[3][3]
// the list of properties must be put into an aggregate data astructure aggregate<prop1,prop2,prop3, ... >
//
// * Dimensionality of the space where the objects live 2D (1° template parameters)
// * Type of the space, float (2° template parameters)
// * Information stored by each object (3* template parameters), in this case a Point_test store 4 scalars
// 1 vector and an asymmetric tensor of rank 2
//
// Constructor instead require:
// vd is the instantiation of the object
//
// The Constructor instead require:
//
// * Number of particles 4096 in this case
// * Domain where is defined this structure
// * bc boundary conditions
// * g Ghost
//
// The following construct a vector where each processor has 4096 / N_proc (N_proc = number of processor)
// objects with an undefined position in space. This non-space decomposition is also called data-driven
// decomposition
//
vector_dist<2,float, Particle<float> > vd(4096,domain,bc,g);
vector_dist<2,float, aggregate<float,float[3],float[3][3]> > vd(4096,domain,bc,g);
// the scalar is the element at position 0 in the aggregate
const int scalar = 0;
// the vector is the element at position 1 in the aggregate
const int vector = 1;
// the tensor is the element at position 2 in the aggregate
const int tensor = 2;
//
// ### WIKI 5 ###
//
// Get an iterator that go through the particles, in an undefined position state and define its position
// Get an iterator that go through the 4096 particles, in an undefined position state and define its position
//
auto it = vd.getIterator();
auto it = vd.getDomainIterator();
while (it.isNext())
{
auto key = it.get();
vd.getPos(key)[0] = ud(eg);
vd.getPos(key)[1] = ud(eg);
// we define x, assign a random position between 0.0 and 1.0
vd.getPos(key)[0] = rand() / RAND_MAX;
// we define y, assign a random position between 0.0 and 1.0
vd.getPos(key)[1] = rand() / RAND_MAX;
// next particle
++it;
}
//
// ### WIKI 6 ###
//
// Once we define the position, we distribute them according to the default decomposition
// The default decomposition is created even before assigning the position to the object
// (This will probably change in future)
// Once we define the position, we distribute them according to the default space decomposition
// The default decomposition is created even before assigning the position to the object. It determine
// which part of space each processor manage
//
vd.map();
......@@ -112,39 +103,44 @@ int main(int argc, char* argv[])
// We get the object that store the decomposition, than we iterate again across all the objects, we count them
// and we confirm that all the particles are local
//
//Counter we use it later
size_t cnt = 0;
// Get the space decomposition
auto & ct = vd.getDecomposition();
it = vd.getIterator();
// Get a particle iterator
it = vd.getDomainIterator();
// For each particle ...
while (it.isNext())
{
auto key = it.get();
// The template parameter is unuseful and will probably disappear
if (ct.isLocal(vd.getPos(key)) == false)
std::cerr << "Error particle is not local" << "\n";
// set the all the properties to some numbers
// scalar
vd.template getProp<0>(key) = 1.0;
vd.template getProp<1>(key)[0] = 1.0;
vd.template getProp<1>(key)[1] = 1.0;
vd.template getProp<1>(key)[2] = 1.0;
vd.template getProp<2>(key)[0][0] = 1.0;
vd.template getProp<2>(key)[0][1] = 1.0;
vd.template getProp<2>(key)[0][2] = 1.0;
vd.template getProp<2>(key)[1][0] = 1.0;
vd.template getProp<2>(key)[1][1] = 1.0;
vd.template getProp<2>(key)[1][2] = 1.0;
vd.template getProp<2>(key)[2][0] = 1.0;
vd.template getProp<2>(key)[2][1] = 1.0;
vd.template getProp<2>(key)[2][2] = 1.0;
// ... p
auto p = it.get();
// we set the properties of the particle p
// the scalar property
vd.template getProp<scalar>(p) = 1.0;
vd.template getProp<vector>(p)[0] = 1.0;
vd.template getProp<vector>(p)[1] = 1.0;
vd.template getProp<vector>(p)[2] = 1.0;
vd.template getProp<tensor>(p)[0][0] = 1.0;
vd.template getProp<tensor>(p)[0][1] = 1.0;
vd.template getProp<tensor>(p)[0][2] = 1.0;
vd.template getProp<tensor>(p)[1][0] = 1.0;
vd.template getProp<tensor>(p)[1][1] = 1.0;
vd.template getProp<tensor>(p)[1][2] = 1.0;
vd.template getProp<tensor>(p)[2][0] = 1.0;
vd.template getProp<tensor>(p)[2][1] = 1.0;
vd.template getProp<tensor>(p)[2][2] = 1.0;
// increment the counter
cnt++;
// next particle
++it;
}
......@@ -156,6 +152,8 @@ int main(int argc, char* argv[])
// the variable count and finaly execute. All the operations are asynchronous, execute work like a barrier and ensure that all the
// queued operations are executed
//
auto & v_cl = create_vcluster();
v_cl.sum(cnt);
v_cl.execute();
......
......@@ -7,6 +7,12 @@ if [ -d "$1/PETSC" ]; then
exit 0
fi
# Detect gcc pr clang
source script/detect_gcc
detect_gcc_or_clang g++
## If some dependencies has been installed feed them to PETSC
MUMPS_extra_libs=""
......@@ -14,7 +20,7 @@ MUMPS_extra_libs=""
configure_options=""
configure_options_scalapack=""
configure_options_superlu=""
configure_trilinos_options=" -D TPL_ENABLE_MPI=ON -D Trilinos_ENABLE_OpenMP=ON"
configure_trilinos_options=" -D TPL_ENABLE_MPI=ON "
configure_options_hypre=""
### Here we install OpenBLAS and SUITESPARSE
......@@ -84,7 +90,15 @@ if [ ! -d "$1/TRILINOS" ]; then
cd trilinos-12.6.1-Source
mkdir build
cd build
cmake -D CMAKE_INSTALL_PREFIX:PATH=$1/TRILINOS -D CMAKE_BUILD_TYPE=RELEASE -D Trilinos_ENABLE_TESTS=OFF -D Trilinos_ENABLE_ALL_PACKAGES=ON $configure_trilinos_options ../.
### On clang we have no openMP
if [ x"$dgc_compiler" == x"clang++" ]; then
conf_trl_openmp="-D Trilinos_ENABLE_OpenMP=OFF"
else
conf_trl_openmp="-D Trilinos_ENABLE_OpenMP=ON"
fi
cmake -D CMAKE_INSTALL_PREFIX:PATH=$1/TRILINOS -D CMAKE_BUILD_TYPE=RELEASE $conf_trl_openmp -D Trilinos_ENABLE_TESTS=OFF -D Trilinos_ENABLE_ALL_PACKAGES=ON $configure_trilinos_options ../.
make -j $2
if [ $? -eq 0 ]; then
......@@ -139,8 +153,16 @@ if [ ! -d "$1/MUMPS" ]; then
if [ x"$platform" = x"osx" ]; then
# installation for OSX
echo "OSX TO DO BYE"
exit 1
sed -i "" -e "s|CC = cc|CC = mpicc|" Makefile.inc
sed -i "" -e "s|FC = f90| FC = mpif90|" Makefile.inc
sed -i "" -e "s|FL = f90| FL = mpif90|" Makefile.inc
sed -i "" -e "s|SCALAP = -lscalapack -lblacs|SCALAP = -L$1/SCALAPACK/lib -L$1/OPENBLAS/lib -lscalapack|" Makefile.inc
sed -i "" -e "s|LIBBLAS = -lblas|LIBBLAS = -lopenblas|" Makefile.inc
sed -i "" -e "s|OPTF = -O|OPTF = -fpic -O3" Makefile.inc
sed -i "" -e "s|OPTC = -O -I.|OPTC = -fpic -O3 -I." Makefile.inc
sed -i "" -e "s|OPTL = -O|OPTL = -fpic -O3" Makefile.inc
else
# Installation for linux
......
#! /bin/bash
source script/detect_gcc
source script/discover_os
detect_gcc_or_clang g++
discover_os
# check if the directory $1/SUITESPARSE exist
......
......@@ -68,6 +68,31 @@ if [ x"$platform" = x"linux" -a x"$pcman" = x"yum" ]; then
fi
fi
#### if we are on OSX we install gnu-sed
if [ x"platform" == x"osx" ]
command -v gsed >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo >&2
echo -e "gsed\033[91;5;1m FAILED \033[0m"
echo "OpenFPM require gnu-sed but it's not installed, searching a solution... "
solve_gsed $platform
command -v gsed >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo -e "gsed\033[91;5;1m FAILED \033[0m"
exit 1
else
echo -e "gsed\033[92;1m SUCCESS \033[0m"
fi
else
echo -e "gsed\033[92;1m SUCCESS \033[0m"
fi
fi
####
command -v cmake >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo >&2
......
#! /bin/bash
function solve_gsed() {
source script/show_solutions
source script/discover_package_manager
discover_package_manager $1
pcman=$discover_package_manager_ret
if [ x"$pcman" = x"" ]; then
exit 1
fi
if [ x"$1" = x"osx" ]; then
commands[0]="$pcman install gnu-sed"
possible_solutions "${commands[@]}"
fi
}
......@@ -18,6 +18,7 @@
#include "Packer_Unpacker/Packer.hpp"
#include "Packer_Unpacker/Unpacker.hpp"
#include "Decomposition/CartDecomposition.hpp"
#include "data_type/aggregate.hpp"
// External ghost box to send for internal ghost box fixation
template<unsigned int dim>
......
......@@ -26,6 +26,7 @@
#include "Grid/grid_dist_id_iterator_dec.hpp"
#include "Vector/vector_dist_ofb.hpp"
#include "Decomposition/CartDecomposition.hpp"
#include "data_type/aggregate.hpp"
#define V_SUB_UNIT_FACTOR 64
......@@ -1015,7 +1016,7 @@ public:
{
// Get ghost and anlarge by 1%
Ghost<dim,St> g = dec.getGhost();
g.magnify(1.01);
g.magnify(1.013);
return getCellList(r_cut, g);
}
......@@ -1077,6 +1078,7 @@ public:
{
div[i] = static_cast<size_t>((pbox.getP2().get(i) - pbox.getP1().get(i)) / r_cut);
div[i]++;
pbox.setHigh(i,pbox.getLow(i) + div[i]*r_cut);
}
cell_list.Initialize(pbox, div);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment