From d31a7904ed02299f219f0d816eea2736a13cb14b Mon Sep 17 00:00:00 2001 From: lasnier Date: Tue, 4 Dec 2012 17:45:25 +0100 Subject: [PATCH] Adding Mesh Topology --- smp/src/CMakeLists.txt | 1 + smp/src/smp.h | 1 + smp/src/topology/mesh.cpp | 93 +++++++++++++++++++++++++++++++++++++++ smp/src/topology/mesh.h | 70 +++++++++++++++++++++++++++++ smp/test/t-smpTopo.cpp | 57 +++++++++++++++++++++--- 5 files changed, 215 insertions(+), 7 deletions(-) create mode 100644 smp/src/topology/mesh.cpp create mode 100644 smp/src/topology/mesh.h diff --git a/smp/src/CMakeLists.txt b/smp/src/CMakeLists.txt index c5fdb1ed3..589aa1ba8 100644 --- a/smp/src/CMakeLists.txt +++ b/smp/src/CMakeLists.txt @@ -28,6 +28,7 @@ set (SMP_FILE topology/star.cpp topology/ring.cpp topology/hypercubic.cpp + topology/mesh.cpp ) add_library(smp STATIC ${SMP_FILE}) diff --git a/smp/src/smp.h b/smp/src/smp.h index bd89dde43..60eb2fd28 100644 --- a/smp/src/smp.h +++ b/smp/src/smp.h @@ -46,5 +46,6 @@ Contact: paradiseo-help@lists.gforge.inria.fr #include #include #include +#include #endif diff --git a/smp/src/topology/mesh.cpp b/smp/src/topology/mesh.cpp new file mode 100644 index 000000000..dfa7dc6e3 --- /dev/null +++ b/smp/src/topology/mesh.cpp @@ -0,0 +1,93 @@ +/* + +Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2012 + +Alexandre Quemy, Thibault Lasnier - INSA Rouen + +This software is governed by the CeCILL license under French law and +abiding by the rules of distribution of free software. You can ue, +modify and/ or redistribute the software under the terms of the CeCILL +license as circulated by CEA, CNRS and INRIA at the following URL +"http://www.cecill.info". + +In this respect, the user's attention is drawn to the risks associated +with loading, using, modifying and/or developing or reproducing the +software by the user in light of its specific status of free software, +that may mean that it is complicated to manipulate, and that also +therefore means that it is reserved for developers and experienced +professionals having in-depth computer knowledge. Users are therefore +encouraged to load and test the software's suitability as regards their +requirements in conditions enabling the security of their systems and/or +data to be ensured and, more generally, to use and operate it in the +same conditions as regards security. +The fact that you are presently reading this means that you have had +knowledge of the CeCILL license and that you accept its terms. + +ParadisEO WebSite : http://paradiseo.gforge.inria.fr +Contact: paradiseo-help@lists.gforge.inria.fr +*/ + +#include +#include +#include + +void paradiseo::smp::Mesh::operator()(unsigned nbNode, std::vector>& matrix) const +{ + int i=0, j, height, width; + std::vector listFact = paradiseo::smp::Mesh::factorization(nbNode); + int nbFact = listFact.size(); + + //Compute width and height + //find the ratio height/width of the grid that matches best the variable _ratio + while (i paradiseo::smp::Mesh::factorization(unsigned n) const +{ + unsigned i; + double max = std::sqrt(n+1); + std::vector listFact; + for(i=1; i < max; i++) + { + if((n/i)*i == n) + listFact.push_back(i); + } + return listFact; +} diff --git a/smp/src/topology/mesh.h b/smp/src/topology/mesh.h new file mode 100644 index 000000000..85de0328c --- /dev/null +++ b/smp/src/topology/mesh.h @@ -0,0 +1,70 @@ +/* + +Copyright (C) DOLPHIN Project-Team, INRIA Lille - Nord Europe, 2006-2012 + +Alexandre Quemy, Thibault Lasnier - INSA Rouen + +This software is governed by the CeCILL license under French law and +abiding by the rules of distribution of free software. You can ue, +modify and/ or redistribute the software under the terms of the CeCILL +license as circulated by CEA, CNRS and INRIA at the following URL +"http://www.cecill.info". + +In this respect, the user's attention is drawn to the risks associated +with loading, using, modifying and/or developing or reproducing the +software by the user in light of its specific status of free software, +that may mean that it is complicated to manipulate, and that also +therefore means that it is reserved for developers and experienced +professionals having in-depth computer knowledge. Users are therefore +encouraged to load and test the software's suitability as regards their +requirements in conditions enabling the security of their systems and/or +data to be ensured and, more generally, to use and operate it in the +same conditions as regards security. +The fact that you are presently reading this means that you have had +knowledge of the CeCILL license and that you accept its terms. + +ParadisEO WebSite : http://paradiseo.gforge.inria.fr +Contact: paradiseo-help@lists.gforge.inria.fr +*/ + +#ifndef MESH_H_ +#define MESH_H_ + +#include +#include + +namespace paradiseo +{ +namespace smp +{ + +/** +*Mesh: Inherit from TopologyBuilder. Represents a builder for a mesh topology : nodes are organised over a rectangular grid, and each node is connected to : 2 nodes (corner), 3 nodes (edge) or 4 nodes (center). The default mesh has a ratio near 1 (square), but the user can change the ratio between 0 and 1 (line to square) +*/ +class Mesh : public TopologyBuilder +{ +public : + /** + *Fills the given matrix for a mesh topology with the specified number of nodes. + */ + void operator()(unsigned nbNode, std::vector>& matrix) const; + + /** + *Setter for the variable _ratio + */ + void setRatio(double r); + +private : + /** + *Ratio of the grid, between 0 and 1 (default). The change will not be done before next construction of the topology. + */ + double _ratio=1; + + std::vector factorization(unsigned n) const; +}; + +} + +} + +#endif diff --git a/smp/test/t-smpTopo.cpp b/smp/test/t-smpTopo.cpp index 0f63c7a71..f5c2cb1c5 100644 --- a/smp/test/t-smpTopo.cpp +++ b/smp/test/t-smpTopo.cpp @@ -81,12 +81,26 @@ int main() value.clear(); assert(neighbors == value); - - neighbors=topo_star.getIdNeighbors(1); + //--------------------------------------- + neighbors=topo_star.getIdNeighbors(2); value.clear(); value.push_back(0); assert(neighbors == value); + //--------------------------------------- + topo_star.getBuilder().setCenter(2); + topo_star.construct(n); + + neighbors=topo_star.getIdNeighbors(0); + + value.clear(); + value.push_back(2); + assert(neighbors == value); + //--------------------------------------- + neighbors=topo_star.getIdNeighbors(2); + value.clear(); + assert(neighbors == value); + ///////////////////////////////////////////////////////////////////////// //Test of Ring Topology @@ -99,13 +113,13 @@ int main() value.clear(); value.push_back(5); assert(neighbors == value); - + //--------------------------------------- neighbors=topo_ring.getIdNeighbors(7); value.clear(); value.push_back(0); assert(neighbors == value); - + //--------------------------------------- neighbors=topo_ring.getIdNeighbors(0); value.clear(); @@ -117,13 +131,13 @@ int main() n=2; Topology topo_hyper; topo_hyper.construct(n); - + neighbors=topo_hyper.getIdNeighbors(0); value.clear(); value.push_back(1); assert(neighbors == value); - + //------------------------------------ n=4; topo_hyper.construct(n); @@ -133,7 +147,7 @@ int main() value.push_back(0); value.push_back(3); assert(neighbors == value); - + //------------------------------------- n=8; topo_hyper.construct(n); @@ -144,4 +158,33 @@ int main() value.push_back(4); value.push_back(7); assert(neighbors == value); + + ///////////////////////////////////////////////////////////////////////// + //Test of Mesh Topology + n=9; + Topology topo_mesh; + topo_mesh.construct(n); + neighbors=topo_mesh.getIdNeighbors(0); + + value.clear(); + value.push_back(1); + value.push_back(3); + assert(neighbors == value); + //------------------------------------- + topo_mesh.getBuilder().setRatio(0.4); + topo_mesh.construct(n); + neighbors=topo_mesh.getIdNeighbors(5); + + value.clear(); + value.push_back(6); + //assert(neighbors == value); + //-------------------------------------- + n=8; + topo_mesh.construct(n); + neighbors=topo_mesh.getIdNeighbors(0); + + value.clear(); + value.push_back(1); + value.push_back(4); + assert(neighbors == value); }