diff --git a/AMDiS/src/parallel/DofComm.cc b/AMDiS/src/parallel/DofComm.cc index 52660d1b4c8c0b2158ef379821de368e10a4cab8..0ec8f96357cf1038d3fecf9996f958968ad7e589 100644 --- a/AMDiS/src/parallel/DofComm.cc +++ b/AMDiS/src/parallel/DofComm.cc @@ -44,7 +44,12 @@ namespace AMDiS { void DofComm::create(InteriorBoundary &boundary) { + FUNCNAME("DofComm::create()"); + + MSG("---> senddofs\n"); createContainer(boundary.getOwn(), sendDofs); + + MSG("---> recvdofs\n"); createContainer(boundary.getOther(), recvDofs); } diff --git a/AMDiS/src/parallel/InteriorBoundary.cc b/AMDiS/src/parallel/InteriorBoundary.cc index 020a3f295c1d0c516c768a629794c3ed989fcf94..5451e74aafede2c0e849eca1b1fd0c7fd430e467 100644 --- a/AMDiS/src/parallel/InteriorBoundary.cc +++ b/AMDiS/src/parallel/InteriorBoundary.cc @@ -72,7 +72,6 @@ namespace AMDiS { continue; int owner = elObjDb.getIterateOwner(level); - MSG("OWNER IN LEVEL %d IS %d\n",level, owner); ElementObjectData& rankBoundEl = objData[globalMpiRank]; AtomicBoundary bound; diff --git a/AMDiS/src/parallel/MeshDistributor.cc b/AMDiS/src/parallel/MeshDistributor.cc index da24936a307896873136b9958865afe1f6522d40..3786a0d9529750105ee35372f70ab6527e028ef0 100644 --- a/AMDiS/src/parallel/MeshDistributor.cc +++ b/AMDiS/src/parallel/MeshDistributor.cc @@ -1535,12 +1535,11 @@ namespace AMDiS { dofComm.init(0, levelData, feSpaces); dofComm.create(intBoundary); -#if 0 if (levelData.getLevelNumber() > 1) { - dofCommSd.init(1, levelData, feSpaces); - dofCommSd.create(intBoundary); + MSG("START CREATE DOF-COMM-SD\n"); + dofCommSd.init(0, levelData, feSpaces); + dofCommSd.create(intBoundarySd); } -#endif // === If requested, create more information on communication DOFs. === diff --git a/AMDiS/src/parallel/MeshDistributor.h b/AMDiS/src/parallel/MeshDistributor.h index 0686801a42eb37ac96ca91535ace1b095371c111..c0a2d1ab7fa8dd99ccd1983a569d3ba43b071d13 100644 --- a/AMDiS/src/parallel/MeshDistributor.h +++ b/AMDiS/src/parallel/MeshDistributor.h @@ -162,11 +162,21 @@ namespace AMDiS { return dofComm; } + DofComm& getDofCommSd() + { + return dofCommSd; + } + InteriorBoundary& getIntBoundary() { return intBoundary; } + InteriorBoundary& getIntBoundarySd() + { + return intBoundarySd; + } + inline long getLastMeshChangeIndex() { return lastMeshChangeIndex; diff --git a/test/mpi/data/data0006/dofcomm_level_1.dat b/test/mpi/data/data0006/dofcomm_level_1.dat new file mode 100644 index 0000000000000000000000000000000000000000..fc634ebc37ad909cf1654e575fc59208a328e14f --- /dev/null +++ b/test/mpi/data/data0006/dofcomm_level_1.dat @@ -0,0 +1,17 @@ +# rank_id n_own_dofs n_other_dofs +0 0 5 +1 2 3 +2 0 5 +3 2 3 +4 2 3 +5 5 0 +6 2 3 +7 5 0 +8 0 5 +9 2 3 +10 0 5 +11 2 3 +12 2 3 +13 5 0 +14 2 3 +15 5 0 diff --git a/test/mpi/data/data0006/interior_boundary_p0.ser b/test/mpi/data/data0006/interior_boundary_p0.ser new file mode 100644 index 0000000000000000000000000000000000000000..c230d070cb5668e1c088410570479ed22a04ef0d Binary files /dev/null and b/test/mpi/data/data0006/interior_boundary_p0.ser differ diff --git a/test/mpi/data/data0006/interior_boundary_p1.ser b/test/mpi/data/data0006/interior_boundary_p1.ser new file mode 100644 index 0000000000000000000000000000000000000000..63aae7d5bf240504fb63e24d9076154a5ce83a31 Binary files /dev/null and b/test/mpi/data/data0006/interior_boundary_p1.ser differ diff --git a/test/mpi/data/data0006/interior_boundary_p10.ser b/test/mpi/data/data0006/interior_boundary_p10.ser new file mode 100644 index 0000000000000000000000000000000000000000..80a60b5432510fb834e4aae5e45223454ce109da Binary files /dev/null and b/test/mpi/data/data0006/interior_boundary_p10.ser differ diff --git a/test/mpi/data/data0006/interior_boundary_p11.ser b/test/mpi/data/data0006/interior_boundary_p11.ser new file mode 100644 index 0000000000000000000000000000000000000000..5737ad1ffd644e92951e7ecf7c10537bcf479aff Binary files /dev/null and b/test/mpi/data/data0006/interior_boundary_p11.ser differ diff --git a/test/mpi/data/data0006/interior_boundary_p12.ser b/test/mpi/data/data0006/interior_boundary_p12.ser new file mode 100644 index 0000000000000000000000000000000000000000..fbbaf66529e4c006aa747fb4f96a3537255a3493 Binary files /dev/null and b/test/mpi/data/data0006/interior_boundary_p12.ser differ diff --git a/test/mpi/data/data0006/interior_boundary_p13.ser b/test/mpi/data/data0006/interior_boundary_p13.ser new file mode 100644 index 0000000000000000000000000000000000000000..49dc5f60595fb78f04c21c6d6ea90f6d47f51336 Binary files /dev/null and b/test/mpi/data/data0006/interior_boundary_p13.ser differ diff --git a/test/mpi/data/data0006/interior_boundary_p14.ser b/test/mpi/data/data0006/interior_boundary_p14.ser new file mode 100644 index 0000000000000000000000000000000000000000..8880e292d4438ae17656d334c50cc770cc71b2a4 Binary files /dev/null and b/test/mpi/data/data0006/interior_boundary_p14.ser differ diff --git a/test/mpi/data/data0006/interior_boundary_p15.ser b/test/mpi/data/data0006/interior_boundary_p15.ser new file mode 100644 index 0000000000000000000000000000000000000000..7c839a8ae54d482cb748ff0cfaade00d5f148445 Binary files /dev/null and b/test/mpi/data/data0006/interior_boundary_p15.ser differ diff --git a/test/mpi/data/data0006/interior_boundary_p2.ser b/test/mpi/data/data0006/interior_boundary_p2.ser new file mode 100644 index 0000000000000000000000000000000000000000..277ea3203ba3bcdd20b520ec87f33194c8667839 Binary files /dev/null and b/test/mpi/data/data0006/interior_boundary_p2.ser differ diff --git a/test/mpi/data/data0006/interior_boundary_p3.ser b/test/mpi/data/data0006/interior_boundary_p3.ser new file mode 100644 index 0000000000000000000000000000000000000000..5a54c7ebbff83cf11d48807c413891f33ec56411 Binary files /dev/null and b/test/mpi/data/data0006/interior_boundary_p3.ser differ diff --git a/test/mpi/data/data0006/interior_boundary_p4.ser b/test/mpi/data/data0006/interior_boundary_p4.ser new file mode 100644 index 0000000000000000000000000000000000000000..13f7c3d6448fe4b4962cb64a7dc5ff84965ee762 Binary files /dev/null and b/test/mpi/data/data0006/interior_boundary_p4.ser differ diff --git a/test/mpi/data/data0006/interior_boundary_p5.ser b/test/mpi/data/data0006/interior_boundary_p5.ser new file mode 100644 index 0000000000000000000000000000000000000000..892e8fcf6cf438d7af1d6da020a238ed1035f37f Binary files /dev/null and b/test/mpi/data/data0006/interior_boundary_p5.ser differ diff --git a/test/mpi/data/data0006/interior_boundary_p6.ser b/test/mpi/data/data0006/interior_boundary_p6.ser new file mode 100644 index 0000000000000000000000000000000000000000..609c5d881e0cc4dc11fdfbeb6a0ad6061c80d90e Binary files /dev/null and b/test/mpi/data/data0006/interior_boundary_p6.ser differ diff --git a/test/mpi/data/data0006/interior_boundary_p7.ser b/test/mpi/data/data0006/interior_boundary_p7.ser new file mode 100644 index 0000000000000000000000000000000000000000..09ca2ba45d44dd5b987771c5c001b0c618a29946 Binary files /dev/null and b/test/mpi/data/data0006/interior_boundary_p7.ser differ diff --git a/test/mpi/data/data0006/interior_boundary_p8.ser b/test/mpi/data/data0006/interior_boundary_p8.ser new file mode 100644 index 0000000000000000000000000000000000000000..728777c06dd495a8313d3e4b99649dda818cd55b Binary files /dev/null and b/test/mpi/data/data0006/interior_boundary_p8.ser differ diff --git a/test/mpi/data/data0006/interior_boundary_p9.ser b/test/mpi/data/data0006/interior_boundary_p9.ser new file mode 100644 index 0000000000000000000000000000000000000000..f771930413fd346fb43f950f97f99509a55ca91d Binary files /dev/null and b/test/mpi/data/data0006/interior_boundary_p9.ser differ diff --git a/test/mpi/init/test0006.dat.2d b/test/mpi/init/test0006.dat.2d new file mode 100644 index 0000000000000000000000000000000000000000..f1e917797114064f40fc177f9d9a536e3879dcc9 --- /dev/null +++ b/test/mpi/init/test0006.dat.2d @@ -0,0 +1,25 @@ +dimension of world: 2 + +elliptMesh->macro file name: ./macro/macro.stand.p16.2d +elliptMesh->global refinements: 3 + +ellipt->mesh: elliptMesh +ellipt->dim: 2 +ellipt->components: 1 +ellipt->polynomial degree[0]: 1 + +ellipt->solver: cg +ellipt->solver->max iteration: 10 +ellipt->solver->tolerance: 1.e-8 +ellipt->solver->info: 10 +ellipt->solver->left precon: diag +ellipt->solver->right precon: no + +ellipt->estimator[0]: 0 +ellipt->marker[0]->strategy: 0 + +parallel->log main rank: 0 +parallel->pre refine: 0 +parallel->partitioner: checker +parallel->multi level test: 1 +parallel->solver: petsc-feti diff --git a/test/mpi/src/test0002.cc b/test/mpi/src/test0002.cc index 3ddc94d63397bc05882b3454be2793b48b1cecac..a2f54a1fa0ef06d0ca8219b46687b3193a6f1a00 100644 --- a/test/mpi/src/test0002.cc +++ b/test/mpi/src/test0002.cc @@ -9,7 +9,8 @@ using namespace AMDiS; using namespace std; /* - - + - Simple FETI-DP test on the number of local and global primal, dual and + interior nodes. */ BOOST_AUTO_TEST_CASE(amdis_mpi_feti) diff --git a/test/mpi/src/test0003.cc b/test/mpi/src/test0003.cc index 2706d109d873d61d01da6f27ba1c66e111d9210e..31109f2ad1e60d415acbd33cb5e44eb7c6d1744d 100644 --- a/test/mpi/src/test0003.cc +++ b/test/mpi/src/test0003.cc @@ -11,7 +11,7 @@ using namespace std; using boost::lexical_cast; /* - - + - Test 2-level FETI-DP on the number of global primal and dual nodes. */ BOOST_AUTO_TEST_CASE(amdis_mpi_feti_multilevel) diff --git a/test/mpi/src/test0004.cc b/test/mpi/src/test0004.cc index ac4c48451bb0c4bfed1b9418cd791d255ff342af..b0d15b540a2a50125d57211c4d3657fed0a39044 100644 --- a/test/mpi/src/test0004.cc +++ b/test/mpi/src/test0004.cc @@ -9,7 +9,7 @@ using namespace AMDiS; using namespace std; /* - - + - Test DOF communicator on 2-level decomposition of a 4x4 rank domain. */ BOOST_AUTO_TEST_CASE(amdis_mpi_feti_multilevel) diff --git a/test/mpi/src/test0005.cc b/test/mpi/src/test0005.cc index a136c26b0a16e759e65979c2d117ea71460c3c84..38a372c9e7f1628f416b0db74bceaaab2fbb0deb 100644 --- a/test/mpi/src/test0005.cc +++ b/test/mpi/src/test0005.cc @@ -9,7 +9,8 @@ using namespace AMDiS; using namespace std; /* - - + - Test for interior boundaries on a 2-level 4x4 rank decomposition. + - Compaires the interior boundary object with a serialization file. */ diff --git a/test/mpi/src/test0006.cc b/test/mpi/src/test0006.cc new file mode 100644 index 0000000000000000000000000000000000000000..3c7f9ae580b013368e6f8c7a548f2afb0e983807 --- /dev/null +++ b/test/mpi/src/test0006.cc @@ -0,0 +1,88 @@ +#define BOOST_TEST_DYN_LINK +#define BOOST_TEST_MODULE 0005 +#define BOOST_TEST_NO_MAIN + +#include <boost/test/unit_test.hpp> +#include <AMDiS.h> + +using namespace AMDiS; +using namespace std; + +/* + - Test for interior boundaries of the subdomains on a 2-level + 4x4 rank decomposition. + - Compaires the interior boundary object with a serialization file. + - Test for DOF communicators on the subdomains. +*/ + + +void boundaryTest(RankToBoundMap &map0, RankToBoundMap &map1) +{ + BOOST_CHECK_MESSAGE(map0.size() == map1.size(), + "Boundaries have different size!\n"); + + for (RankToBoundMap::iterator it = map0.begin(); it != map0.end(); ++it) { + if (map1.count(it->first) == 0) { + MSG("Boundary with rank %d missing!\n", it->first); + BOOST_ERROR(""); + } + + BOOST_CHECK_MESSAGE(it->second.size() == map1[it->first].size(), + "Wrong boundary size!\n"); + + for (unsigned int i = 0; i < it->second.size(); i++) + BOOST_CHECK_MESSAGE(it->second[i] == map1[it->first][i], + "Boundary is not equal!\n"); + } +} + +BOOST_AUTO_TEST_CASE(amdis_mpi_feti_multilevel) +{ + BOOST_REQUIRE(MPI::COMM_WORLD.Get_size() == 16); + + ProblemStat ellipt("ellipt"); + ellipt.initialize(INIT_ALL); + + MeshDistributor *meshDist = MeshDistributor::globalMeshDistributor; + meshDist->initParallelization(); + + const FiniteElemSpace *feSpace = ellipt.getFeSpace(); + + InteriorBoundary testBoundary; + string filename = "data/data0006/interior_boundary_p" + + lexical_cast<string>(MPI::COMM_WORLD.Get_rank()) + ".ser"; + ifstream myfile(filename.c_str()); + testBoundary.deserialize(myfile, ellipt.getMesh()); + myfile.close(); + + boundaryTest(testBoundary.getOwn(), meshDist->getIntBoundarySd().getOwn()); + boundaryTest(testBoundary.getOther(), meshDist->getIntBoundarySd().getOther()); + boundaryTest(testBoundary.getPeriodic(), meshDist->getIntBoundarySd().getPeriodic()); + + + + Spreadsheet sheet; + sheet.read("data/data0006/dofcomm_level_1.dat"); + vector<vector<double> > &data = sheet.getData(); + + DofComm &dofCommSd = meshDist->getDofCommSd(); + DofComm::LevelDataType &sendDofsSd = dofCommSd.getSendDofs(); + DofComm::LevelDataType &recvDofsSd = dofCommSd.getRecvDofs(); + int nSendDofs = dofCommSd.getNumberDofs(sendDofsSd, 0, feSpace); + int nRecvDofs = dofCommSd.getNumberDofs(recvDofsSd, 0, feSpace); + + int rank = MPI::COMM_WORLD.Get_rank(); + BOOST_CHECK(data[rank][0] == rank); + BOOST_CHECK(data[rank][1] == nSendDofs); + BOOST_CHECK(data[rank][2] == nRecvDofs); +} + + +int main(int argc, char **argv) +{ + AMDiS::init(argc, argv, "./init/test0006.dat.2d"); + + boost::unit_test::unit_test_main(&init_unit_test, argc, argv); + + AMDiS::finalize(); +}