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