Skip to content
Snippets Groups Projects
Commit f4171224 authored by Max Kahnt's avatar Max Kahnt
Browse files

Remove genericvectortoolstest.

parent 14796027
No related branches found
No related tags found
No related merge requests found
dune_add_test(SOURCES arithmetictest.cc)
dune_add_test(SOURCES genericvectortoolstest.cc)
dune_add_test(SOURCES staticmatrixtoolstest.cc)
dune_add_test(SOURCES triangularsolvetest.cc)
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <dune/common/exceptions.hh>
#include <dune/common/fvector.hh>
#include <dune/common/fmatrix.hh>
#include <dune/common/parallel/mpihelper.hh>
#include <dune/common/typeutilities.hh>
#include <dune/istl/bcrsmatrix.hh>
#include <dune/istl/bvector.hh>
#include <dune/istl/matrixindexset.hh>
#include <dune/istl/multitypeblockmatrix.hh>
#include <dune/istl/multitypeblockvector.hh>
#include <dune/matrix-vector/algorithm.hh>
#include <dune/matrix-vector/genericvectortools.hh>
/// custom multitype types to allow for BlockVector nesting
template <class... Args>
struct CustomMultiTypeBlockVector : public Dune::MultiTypeBlockVector<Args...> {
constexpr static int blocklevel = 1; // fake value
};
template <class... Args>
struct CustomMultiTypeBlockMatrix : public Dune::MultiTypeBlockMatrix<Args...> {
constexpr static int blocklevel = 1; // fake value
};
// inject matrix traits for CustomMultiTypeBlockMatrix
namespace Dune { namespace MatrixVector {
template <class... Args>
struct MatrixTraits<CustomMultiTypeBlockMatrix<Args...>> {
enum { isMatrix = true };
};
}}
class ResizeTestSuite {
/// typedefs
using BS = std::bitset<2>;
using FV = Dune::FieldVector<double, 3>;
using BV = Dune::BlockVector<FV>;
using MV = CustomMultiTypeBlockVector<BV, BV, FV>;
using FM = Dune::FieldMatrix<double, 3, 10>;
using BM = Dune::BCRSMatrix<FM>;
using MM = CustomMultiTypeBlockMatrix<
CustomMultiTypeBlockMatrix<BM>,
CustomMultiTypeBlockMatrix<BM>,
CustomMultiTypeBlockMatrix<FM>>;
/// instanciation helper
auto createBM(size_t n) {
BM bm;
Dune::MatrixIndexSet indices(n, n+10);
indices.exportIdx(bm);
return bm;
}
auto createMM(size_t n1, size_t n2) {
using namespace Dune::Indices;
MM mm;
mm[_0][_0] = createBM(n1);
mm[_1][_0] = createBM(n2);
return mm;
}
bool checkGetSize() {
using namespace Dune::MatrixVector::Generic::Impl;
std::cout << "Testing getSize... ";
auto hasSize = [](auto&& c, auto&& size) {
if(getSize(c, Dune::PriorityTag<42>()) != size)
DUNE_THROW(Dune::Exception, "Unexpected getSize mismatch.");
};
try {
// test vector types
using BS = std::bitset<2>;
hasSize(BS(), (uint) 2);
using FV = Dune::FieldVector<double, 3>;
hasSize(FV(), (uint) 3);
using BV = Dune::BlockVector<FV>;
hasSize(BV(4), (uint) 4);
using MV = CustomMultiTypeBlockVector<FV, BV, FV, FV, BV>;
hasSize(MV(), (uint) 5);
// test matrix types
using FM = Dune::FieldMatrix<double, 3, 10>;
hasSize(FM(), (uint) 3);
using BM = Dune::BCRSMatrix<FM>;
BM bm;
Dune::MatrixIndexSet indices(4, 10);
indices.exportIdx(bm);
hasSize(bm, (uint) 4);
using MM = CustomMultiTypeBlockMatrix<BM, BM, BM, FM, FM>;
hasSize(MM(), (uint) 5);
} catch (Dune::Exception e) {
std::cout << "FAILURE." << std::endl;
std::cout << e << std::endl;
return false;
}
std::cout << "done." << std::endl;
return true;
}
//! yield test access to protected ScalarSwitch method subSizeProvider
template <class Vector>
struct SubSizeProviderAccess : Dune::MatrixVector::Generic::Impl::ScalarSwitch<Vector> {
using Base = Dune::MatrixVector::Generic::Impl::ScalarSwitch<Vector>;
template <class T>
static decltype(auto) test(T&& t) {
return Base::subSizeProvider(std::forward<T>(t));
}
};
bool checkSubSizeProvider() {
using namespace Dune::MatrixVector;
std::cout << "Testing subSizeProvider... ";
// check if the sizeProvider yields the same result as given in t
auto pointsToSame = [](auto& o1, auto& o2) {
if (&o1 != &o2)
DUNE_THROW(Dune::Exception, "Unexpected subSizeProvider.");
};
// check if the sizeProvider yields the correct result for given vector type
auto testVectorRange = [&](const auto& v) {
sparseRangeFor(v, [&](auto&& vi, auto) {
pointsToSame(vi, SubSizeProviderAccess<std::decay_t<decltype(v)>>::test(vi));
});
};
// check if the sizeProvider yields the correct result for given matrix type
auto testMatrixRange = [&](const auto& m) {
sparseRangeFor(m, [&](auto&& mi, auto) {
sparseRangeFirst(mi, [&](auto&& mii) {
pointsToSame(mii, SubSizeProviderAccess<std::decay_t<decltype(m)>>::test(mi));
});
});
};
try {
// test vector types
testVectorRange(FV());
testVectorRange(BV(4));
testVectorRange(MV());
// test matrix types
testMatrixRange(FM());
testMatrixRange(createBM(4));
testMatrixRange(createMM(6,0));
} catch (Dune::Exception e) {
std::cout << "FAILURE." << std::endl;
std::cout << e << std::endl;
return false;
}
std::cout << "done." << std::endl;
return true;
}
bool checkResize() {
using namespace Dune::MatrixVector::Generic;
std::cout << "Testing resize... ";
// test failure for invalid static resize
try {
resize(FV(), Dune::FieldVector<int, 5>());
return false;
} catch (Dune::Exception) {
// TODO make sure the right exception is thrown
}
auto hasSize = [](auto&& size, auto&& expectedSize) {
if(size != expectedSize)
DUNE_THROW(Dune::Exception, "Resize created unexpected size.");
};
try {
// test vector types
BS bs, bs2;
resize(bs, bs2);
FV fv, fv2;
resize(fv, fv2);
BV bv, bv2(5);
resize(bv, bv2);
hasSize(bv.size(), (uint) 5);
MV mv, mv2;
using namespace Dune::Indices;
mv2[_0].resize(5);
resize(mv, mv2);
hasSize(mv[_0].size(), (uint) 5);
hasSize(mv[_1].size(), (uint) 0);
hasSize(mv[_2].size(), (uint) 3);
// test "natural" matrix types
FM fm;
resize(fv, fm);
BM bm = createBM(4);
resize(bv, bm);
hasSize(bv.size(), (uint) 4);
MM mm = createMM(0, 6);
resize(mv, mm);
hasSize(mv[_0].size(), (uint) 0);
hasSize(mv[_1].size(), (uint) 6);
hasSize(mv[_2].size(), (uint) 3);
// test "unnatural" matrix types
// TODO
} catch (Dune::Exception e) {
std::cout << "FAILURE." << std::endl;
std::cout << e << std::endl;
return false;
}
std::cout << "done." << std::endl;
return true;
}
public:
bool check() {
std::cout << "Resize test starting.." << std::endl;
bool passed = true;
passed = passed and checkGetSize();
passed = passed and checkSubSizeProvider();
passed = passed and checkResize();
// TODO test ignore nodes type
if(passed)
std::cout << "Resize test succeeded.\n" << std::endl;
return passed;
}
};
int main(int argc, char* argv[]) {
Dune::MPIHelper::instance(argc, argv);
bool passed = ResizeTestSuite().check();
if(not passed)
return 1;
return 0;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment