From 6f8a743343738edd34014e01fc31bda60875c6a1 Mon Sep 17 00:00:00 2001 From: Thomas Witkowski <thomas.witkowski@gmx.de> Date: Fri, 4 May 2012 10:07:24 +0000 Subject: [PATCH] Add test for multilevel interior boundaries and dof communicators. --- AMDiS/src/parallel/DofComm.cc | 5 + AMDiS/src/parallel/InteriorBoundary.cc | 1 - AMDiS/src/parallel/MeshDistributor.cc | 7 +- AMDiS/src/parallel/MeshDistributor.h | 10 ++ test/mpi/data/data0006/dofcomm_level_1.dat | 17 ++++ .../data/data0006/interior_boundary_p0.ser | Bin 0 -> 266 bytes .../data/data0006/interior_boundary_p1.ser | Bin 0 -> 258 bytes .../data/data0006/interior_boundary_p10.ser | Bin 0 -> 266 bytes .../data/data0006/interior_boundary_p11.ser | Bin 0 -> 258 bytes .../data/data0006/interior_boundary_p12.ser | Bin 0 -> 258 bytes .../data/data0006/interior_boundary_p13.ser | Bin 0 -> 358 bytes .../data/data0006/interior_boundary_p14.ser | Bin 0 -> 258 bytes .../data/data0006/interior_boundary_p15.ser | Bin 0 -> 358 bytes .../data/data0006/interior_boundary_p2.ser | Bin 0 -> 266 bytes .../data/data0006/interior_boundary_p3.ser | Bin 0 -> 258 bytes .../data/data0006/interior_boundary_p4.ser | Bin 0 -> 258 bytes .../data/data0006/interior_boundary_p5.ser | Bin 0 -> 358 bytes .../data/data0006/interior_boundary_p6.ser | Bin 0 -> 258 bytes .../data/data0006/interior_boundary_p7.ser | Bin 0 -> 358 bytes .../data/data0006/interior_boundary_p8.ser | Bin 0 -> 266 bytes .../data/data0006/interior_boundary_p9.ser | Bin 0 -> 258 bytes test/mpi/init/test0006.dat.2d | 25 +++++ test/mpi/src/test0002.cc | 3 +- test/mpi/src/test0003.cc | 2 +- test/mpi/src/test0004.cc | 2 +- test/mpi/src/test0005.cc | 3 +- test/mpi/src/test0006.cc | 88 ++++++++++++++++++ 27 files changed, 154 insertions(+), 9 deletions(-) create mode 100644 test/mpi/data/data0006/dofcomm_level_1.dat create mode 100644 test/mpi/data/data0006/interior_boundary_p0.ser create mode 100644 test/mpi/data/data0006/interior_boundary_p1.ser create mode 100644 test/mpi/data/data0006/interior_boundary_p10.ser create mode 100644 test/mpi/data/data0006/interior_boundary_p11.ser create mode 100644 test/mpi/data/data0006/interior_boundary_p12.ser create mode 100644 test/mpi/data/data0006/interior_boundary_p13.ser create mode 100644 test/mpi/data/data0006/interior_boundary_p14.ser create mode 100644 test/mpi/data/data0006/interior_boundary_p15.ser create mode 100644 test/mpi/data/data0006/interior_boundary_p2.ser create mode 100644 test/mpi/data/data0006/interior_boundary_p3.ser create mode 100644 test/mpi/data/data0006/interior_boundary_p4.ser create mode 100644 test/mpi/data/data0006/interior_boundary_p5.ser create mode 100644 test/mpi/data/data0006/interior_boundary_p6.ser create mode 100644 test/mpi/data/data0006/interior_boundary_p7.ser create mode 100644 test/mpi/data/data0006/interior_boundary_p8.ser create mode 100644 test/mpi/data/data0006/interior_boundary_p9.ser create mode 100644 test/mpi/init/test0006.dat.2d create mode 100644 test/mpi/src/test0006.cc diff --git a/AMDiS/src/parallel/DofComm.cc b/AMDiS/src/parallel/DofComm.cc index 52660d1b..0ec8f963 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 020a3f29..5451e74a 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 da24936a..3786a0d9 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 0686801a..c0a2d1ab 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 00000000..fc634ebc --- /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 GIT binary patch literal 266 zcmZQzU|?WoU|?WmU|?W^(jYMyAH)VL`2YX^e~=&ug9SkZj04jN=7TsO)gT%y08$CU zEKoZ@Y!C)Xf)s(+44e!M3?N+~K@bKDA`>u`U`d#2m>^ssE7T8QRZuouk{h2L0OiIM AJpcdz literal 0 HcmV?d00001 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 GIT binary patch literal 258 zcmZQ%fB+^21_ovblK~_K!eB0p0ir>Qz=9wG#sSeFNst&=D~JITM3G>H+5wUTDFR8t v*bLkZ3=IGO|NjpX1YwW@Fh+J2SO7#ItA-l^l7MkwG}tJZYM3BMAshn$XUYsp literal 0 HcmV?d00001 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 GIT binary patch literal 266 zcmZQzU|?WoU|`^8U|?WkU|<jh2{14)FhcoYt~dh&!~g&P|APcU7%T`PV5&hnK@uR$ zAO=+p69g#)V?L;vB48ex9kNheAR|B+s)m69rW#}%NDwRuQw<XYNq{jw)a@{rfmMTL N7#JAjaoGV<003r{6(axu literal 0 HcmV?d00001 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 GIT binary patch literal 258 zcmZQ%U|`^4U|?WkU|<kufB=vf2!nZ|V3L6WBmhzb<uWjcL0KR{kR+H3Qw<Y@OMn>s z3=9m+3<#YdF_1#API(3fhX4Qn{|5<zFjx>oAiE002V-Q_a3er6$gTqM!A8MUqo@SQ Gf-nH$4h<#% literal 0 HcmV?d00001 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 GIT binary patch literal 258 zcmZQ%U|`^2U|?WkU|^7BfB=vf2!nY7V3L6WBmhzb<sww02*Omu1VOsMIzS9w1_lOZ zG<#qQ8KfB)82<nN{~x3fgu%K%1hT6@d@z<mQVll(Bm+|o5(F6o!VECgFhP()I0gXO CE)5p| literal 0 HcmV?d00001 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 GIT binary patch literal 358 zcmZQ(U|`^2U|?WmU|^7DfB+C1guy&PFbPorWkM)U1_lO@Zmhb5AZozIGC|p33RyK= zLKrNC#SWNixJr;hnAtEvxKnxXxkwVE73xu#POy*^n1omkmq1nxm4{F;)gYB{i(#r^ Lf^Z3l9tH*gEKC8H literal 0 HcmV?d00001 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 GIT binary patch literal 258 zcmZQ%U|`^4U|?WkU|^7CfB=vf2!nYdV3L6WBmhzb<sww02*Omu1VOsMIzSA51_lOZ zG<#qQ8RQul82<nN{~x3fgu%K%1hT6@d@z<nQVll(Bm+|o5(F6o!VECgFhP()I0gXm Cq76d; literal 0 HcmV?d00001 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 GIT binary patch literal 358 zcmZQ(U|`^4U|?WmU|^7EfB+C1guy&fFbPorWkM)!1_lO@Zmhb*AZozIGC|p33RyK= zLL4lG#SWNixJr;hnAtEvxKsJ?xkwhI73xu#POy+1n1omkmq1nxm4{F;)gYB{i(#r^ Lf^Z3l9tH*gTaW?O literal 0 HcmV?d00001 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 GIT binary patch literal 266 zcmZQzU|?W|VkQO#23C*&0|Nsi0|Nty59YEnFfjc8|NlQo5QM>kAOfZuq!J_n!VGLs z)i6PjLNEqNfCO2<JTyCap}IgufG|`I0|QJoNGC`TED2K$69h?sG03SP6)=~9*kB0| K!H>%hkR$;Ah7@Z6 literal 0 HcmV?d00001 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 GIT binary patch literal 258 zcmZQ%U|?W^Vs-`y0EvMxn8ykx85lqUAcasa0|OhB1rh{Fg1Io&FhRHkhygO6nE{~_ zBnDCl*2&Mn!0`Y7|NkIC5C#i^2#_uijUtGw8g2wg6|$>9e6TK<Y7~_qSr7&QfIbX% literal 0 HcmV?d00001 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 GIT binary patch literal 258 zcmZQ%fB+^21_n+DlK~_K!cZ=R0ttW=L3l{2Q3PSKFhP(muo#HJ%D}+DjHDAJ22;qu w&A`C$|NsC0AVClY>jDwTt^)DFm<vfY+z5~iOf^UlWDE#1z*NHoK?>m*0C!#tX8-^I literal 0 HcmV?d00001 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 GIT binary patch literal 358 zcmZQ(fB;4Y1_o{jlL5pAVK5iQfYD$<5CIYZ>Bg#y38aF70c;eE4HiOH4VM5J1Cj+9 z38LW`rW&piBm?8XXt*vG1_lO@Q7~N~2@nQpV&DXmSX{(~O#)dpR31XXRD&$XFdHTa Kmw@PDU;qGbEdZYY literal 0 HcmV?d00001 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 GIT binary patch literal 258 zcmZQ%U|?W^VqOLa0EvMxn8yMp85lqUAcasa0|QJoiXcoiOc10CtOLYgXJBApW<cl! xiNO>y@G~$l{Qv*|KS&US!MZ>M%pMd$J|xv}Bal^t1VK7Lm;t65CJ0gp#{iGg43hu= literal 0 HcmV?d00001 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 GIT binary patch literal 358 zcmZQ(U|?WkU|?WmU|`^9fB+C1guy&kFbPorWkM*BP7ubbiw&X%Y%IulC>PZZxCA>? z8g40+4|fq<B}f8hHcSw%3nYQlMZ6%bP>;fNf`$0NB*cSo31rn!c?bnl4N?iW7^WH~ L2$z89VPF6No^b%( literal 0 HcmV?d00001 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 GIT binary patch literal 266 zcmZQzU|?WoU|`^6U|?WkU|<jg2{14)FhcoYt}p`w!~g&P|APcU7%T`PV5&hnK@uR$ zAOuwn69g#)V;-oP0$?7R9g<L8AR|B+s)m69rW#}%NDwRuQw<XYNq{jg)a@{rfmMTL N7#J9&aoGV<002zY6!icA literal 0 HcmV?d00001 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 GIT binary patch literal 258 zcmZQ%U|`^2U|?WkU|<ktfB=vf2!nZoV3L6WBmhzb<uWh`L0KR{kR+H3Qw<Y@OMn=> z3=9m+3<#YdF_1#APH6@PhX4Qn{|5<zFjx>oAiE002V-Q_a3er6$gTqM!A8MUqo@SQ Gf-nHdnhg2? literal 0 HcmV?d00001 diff --git a/test/mpi/init/test0006.dat.2d b/test/mpi/init/test0006.dat.2d new file mode 100644 index 00000000..f1e91779 --- /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 3ddc94d6..a2f54a1f 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 2706d109..31109f2a 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 ac4c4845..b0d15b54 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 a136c26b..38a372c9 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 00000000..3c7f9ae5 --- /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(); +} -- GitLab