Commit 7dd825c1 authored by Pietro Incardona's avatar Pietro Incardona

Fixing osx PETSC installation

parent b3e80082
#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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment