#define BOOST_TEST_DYN_LINK #define BOOST_TEST_MODULE 0002 #define BOOST_TEST_NO_MAIN #include #include using namespace AMDiS; using namespace std; /* - */ BOOST_AUTO_TEST_CASE(amdis_mpi_feti) { BOOST_REQUIRE(MPI::COMM_WORLD.Get_size() == 16); ProblemStat ellipt("ellipt"); ellipt.initialize(INIT_ALL); MeshDistributor *meshDist = MeshDistributor::globalMeshDistributor; meshDist->initParallelization(); ParallelDofMapping &dofMap = meshDist->getDofMap(); Mesh* mesh = ellipt.getMesh(); BOOST_REQUIRE(mesh->getNumberOfLeaves() == 8); BOOST_REQUIRE(meshDist->getMeshLevelData().getLevelNumber() == 1); vector feSpaces; feSpaces.push_back(ellipt.getFeSpace(0)); PetscSolverFeti &feti = *(dynamic_cast(ellipt.getPetscSolver())); feti.setMeshDistributor(meshDist); feti.initialize(feSpaces); feti.createFetiData(); BOOST_REQUIRE(feti.getNumberOfPrimals() == 21); BOOST_REQUIRE(feti.getNumberOfDuals() == 48); Spreadsheet sheet; sheet.read("data/data0002a"); vector data = sheet.getData()[MPI::COMM_WORLD.Get_rank()]; const FiniteElemSpace *feSpace = ellipt.getFeSpace(0); vector testData; testData.push_back(feti.getNumberOfRankPrimals()); testData.push_back(feti.getNumberOfRankDuals()); testData.push_back(dofMap[feSpace].nRankDofs[0]); testData.push_back(dofMap[feSpace].rStartDofs[0]); testData.push_back(dofMap[feSpace].nOverallDofs[0]); BOOST_REQUIRE(data.size() - 1 == testData.size()); for (int i = 0; i < 5; i++) { if (data[i + 1] != testData[i]) { MSG("Wrong data in column %d: %f %f\n", i, data[i + 1], testData[i]); BOOST_ERROR(""); } } ellipt.getRefinementManager()->globalRefine(mesh, 6); meshDist->checkMeshChange(); feti.createFetiData(); sheet.read("data/data0002b"); data = sheet.getData()[MPI::COMM_WORLD.Get_rank()]; testData.clear(); testData.push_back(feti.getNumberOfRankPrimals()); testData.push_back(feti.getNumberOfRankDuals()); testData.push_back(dofMap[feSpace].nRankDofs[0]); testData.push_back(dofMap[feSpace].rStartDofs[0]); testData.push_back(dofMap[feSpace].nOverallDofs[0]); BOOST_REQUIRE(data.size() - 1 == testData.size()); for (int i = 0; i < 5; i++) { if (data[i + 1] != testData[i]) { MSG("Wrong data in column %d: %f %f\n", i, data[i + 1], testData[i]); BOOST_ERROR(""); } } } int main(int argc, char **argv) { AMDiS::init(argc, argv, "./init/test0002.dat.2d"); boost::unit_test::unit_test_main(&init_unit_test, argc, argv); AMDiS::finalize(); }