1 
2 //          Copyright Alain Miniussi 2014.
3 // Distributed under the Boost Software License, Version 1.0.
4 //    (See accompanying file LICENSE_1_0.txt or copy at
5 //          http://www.boost.org/LICENSE_1_0.txt)
6 
7 // Authors: Alain Miniussi
8 
9 #include <vector>
10 #include <list>
11 #include <iostream>
12 #include <sstream>
13 #include <iterator>
14 #include <algorithm>
15 #include <functional>
16 
17 #include <boost/mpi/communicator.hpp>
18 #include <boost/mpi/collectives.hpp>
19 #include <boost/array.hpp>
20 #include <boost/mpi/environment.hpp>
21 #include <boost/mpi/cartesian_communicator.hpp>
22 
23 #define BOOST_TEST_MODULE mpi_cartesian_topology_init
24 #include <boost/test/included/unit_test.hpp>
25 
26 namespace mpi = boost::mpi;
27 
BOOST_AUTO_TEST_CASE(cartesian_dimension_init)28 BOOST_AUTO_TEST_CASE(cartesian_dimension_init)
29 {
30   // Curly brace initialization syntax not supported on (very) old gnu
31   // This typedef keeps things shorter
32   typedef mpi::cartesian_dimension cd;
33 
34   {
35     // Check the basic ctor
36     mpi::cartesian_dimension def;
37     mpi::cartesian_topology t1(10);
38     BOOST_CHECK(t1.stl() == std::vector<mpi::cartesian_dimension>(10, def));
39   }
40 #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
41   {
42     // Intializer list ctor vs range based
43     int dims[] = {2,3,4};
44     bool per[] = {true, false, true};
45     mpi::cartesian_topology t1(dims, per);
46     mpi::cartesian_topology t2({{2,true},{3, false},{4, true}});
47     BOOST_CHECK(t1.size() == 3);
48     BOOST_CHECK(t1 == t2);
49   }
50 #endif
51   // Container based ctor only available as a replacement for initializer list ctor
52   {
53     // seq ctor vs C array ctor
54     mpi::cartesian_dimension d[] = {cd(2,true),cd(3, false),cd(4, true)};
55     std::list<mpi::cartesian_dimension> seq;
56     std::copy(d, d+3, std::back_inserter(seq));
57     mpi::cartesian_topology t1(seq);
58     mpi::cartesian_topology t2(d);
59     BOOST_CHECK(t1 == t2);
60   }
61   {
62     // Check range based with array based ctor.
63     boost::array<mpi::cartesian_dimension, 3> d = {{cd(2,true),cd(3, false),cd(4, true)}};
64     int dims[] = {2,3,4};
65     bool per[] = {true, false, true};
66     mpi::cartesian_topology t1(dims, per);
67     mpi::cartesian_topology t2(d);
68     BOOST_CHECK(t1.size() == 3);
69     BOOST_CHECK(t1 == t2);
70   }
71   {
72     // Iterator based ctor vs C array based ctor
73     mpi::cartesian_dimension d[] = {cd(2,true),cd(3, false),cd(4, true)};
74     std::vector<mpi::cartesian_dimension> vdims(d, d+3);
75     mpi::cartesian_topology t1(vdims);
76     mpi::cartesian_topology t2(d);
77     BOOST_CHECK(t1.size() == 3);
78     BOOST_CHECK(t1 == t2);
79     BOOST_CHECK(!(t1 != t2));
80     t1[1].periodic = true;
81     BOOST_CHECK(t1 != t2);
82     t1[2].periodic = false;
83     t1[2].size = 0;
84     vdims.push_back(mpi::cartesian_dimension(3, false));
85     mpi::cartesian_topology t3(vdims);
86     BOOST_CHECK(t1 != t3);
87   }
88 }
89