mpi/test/cartesian_topology_init_test.cpp
2019-03-11 22:15:56 +01:00

89 lines
2.7 KiB
C++

// Copyright Alain Miniussi 2014.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// Authors: Alain Miniussi
#include <vector>
#include <list>
#include <iostream>
#include <sstream>
#include <iterator>
#include <algorithm>
#include <functional>
#include <boost/mpi/communicator.hpp>
#include <boost/mpi/collectives.hpp>
#include <boost/array.hpp>
#include <boost/mpi/environment.hpp>
#include <boost/mpi/cartesian_communicator.hpp>
#define BOOST_TEST_MODULE mpi_cartesian_topology_init
#include <boost/test/included/unit_test.hpp>
namespace mpi = boost::mpi;
BOOST_AUTO_TEST_CASE(cartesian_dimension_init)
{
// Curly brace initialization syntax not supported on (very) old gnu
// This typedef keeps things shorter
typedef mpi::cartesian_dimension cd;
{
// Check the basic ctor
mpi::cartesian_dimension def;
mpi::cartesian_topology t1(10);
BOOST_CHECK(t1.stl() == std::vector<mpi::cartesian_dimension>(10, def));
}
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
{
// Intializer list ctor vs range based
int dims[] = {2,3,4};
bool per[] = {true, false, true};
mpi::cartesian_topology t1(dims, per);
mpi::cartesian_topology t2({{2,true},{3, false},{4, true}});
BOOST_CHECK(t1.size() == 3);
BOOST_CHECK(t1 == t2);
}
#endif
// Container based ctor only available as a replacement for initializer list ctor
{
// seq ctor vs C array ctor
mpi::cartesian_dimension d[] = {cd(2,true),cd(3, false),cd(4, true)};
std::list<mpi::cartesian_dimension> seq;
std::copy(d, d+3, std::back_inserter(seq));
mpi::cartesian_topology t1(seq);
mpi::cartesian_topology t2(d);
BOOST_CHECK(t1 == t2);
}
{
// Check range based with array based ctor.
boost::array<mpi::cartesian_dimension, 3> d = {{cd(2,true),cd(3, false),cd(4, true)}};
int dims[] = {2,3,4};
bool per[] = {true, false, true};
mpi::cartesian_topology t1(dims, per);
mpi::cartesian_topology t2(d);
BOOST_CHECK(t1.size() == 3);
BOOST_CHECK(t1 == t2);
}
{
// Iterator based ctor vs C array based ctor
mpi::cartesian_dimension d[] = {cd(2,true),cd(3, false),cd(4, true)};
std::vector<mpi::cartesian_dimension> vdims(d, d+3);
mpi::cartesian_topology t1(vdims);
mpi::cartesian_topology t2(d);
BOOST_CHECK(t1.size() == 3);
BOOST_CHECK(t1 == t2);
BOOST_CHECK(!(t1 != t2));
t1[1].periodic = true;
BOOST_CHECK(t1 != t2);
t1[2].periodic = false;
t1[2].size = 0;
vdims.push_back(mpi::cartesian_dimension(3, false));
mpi::cartesian_topology t3(vdims);
BOOST_CHECK(t1 != t3);
}
}