From 4ff7d475480289ca9e370257890a10ae16c7e978 Mon Sep 17 00:00:00 2001
From: Thomas Witkowski <thomas.witkowski@gmx.de>
Date: Mon, 24 Jan 2011 14:50:10 +0000
Subject: [PATCH] First real Zoltan implementation for parallel mesh
 partitioning.

---
 AMDiS/bin/Makefile.am                     |  2 ++
 AMDiS/bin/Makefile.in                     | 16 +++++++++++++++-
 AMDiS/other/include/Makefile_AMDiS.mk     |  2 ++
 AMDiS/src/ElInfo.h                        |  6 +++---
 AMDiS/src/parallel/MeshDistributor.cc     | 10 +++++++++-
 AMDiS/src/parallel/MeshPartitioner.h      |  5 +++++
 AMDiS/src/parallel/ParMetisPartitioner.cc |  6 ++++--
 AMDiS/src/parallel/ParMetisPartitioner.h  | 12 +++++++-----
 8 files changed, 47 insertions(+), 12 deletions(-)

diff --git a/AMDiS/bin/Makefile.am b/AMDiS/bin/Makefile.am
index bc35ae7a..7cf79d50 100644
--- a/AMDiS/bin/Makefile.am
+++ b/AMDiS/bin/Makefile.am
@@ -17,6 +17,7 @@ if USE_PARALLEL_DOMAIN_AMDIS
   PARALLEL_AMDIS_SOURCES += \
   $(SOURCE_DIR)/parallel/StdMpi.h $(SOURCE_DIR)/parallel/StdMpi.cc \
   $(SOURCE_DIR)/parallel/ParMetisPartitioner.h $(SOURCE_DIR)/parallel/ParMetisPartitioner.cc \
+  $(SOURCE_DIR)/parallel/ZoltanPartitioner.h $(SOURCE_DIR)/parallel/ZoltanPartitioner.cc \
   $(SOURCE_DIR)/parallel/MeshDistributor.h $(SOURCE_DIR)/parallel/MeshDistributor.cc \
   $(SOURCE_DIR)/parallel/MeshPartitioner.h $(SOURCE_DIR)/parallel/MeshPartitioner.cc \
   $(SOURCE_DIR)/parallel/MeshManipulation.h $(SOURCE_DIR)/parallel/MeshManipulation.cc \
@@ -28,6 +29,7 @@ if USE_PARALLEL_DOMAIN_AMDIS
   $(SOURCE_DIR)/parallel/ElementObjectData.h $(SOURCE_DIR)/parallel/ElementObjectData.cc
   libamdis_la_CXXFLAGS += -DHAVE_PARALLEL_DOMAIN_AMDIS=1
   AMDIS_INCLUDES += -I$(PETSC_DIR)/include -I$(PETSC_DIR)/$(PETSC_ARCH)/include
+  AMDIS_INCLUDES += -I$(LIB_DIR)/zoltan_build/include
 endif
 
 if ENABLE_UMFPACK
diff --git a/AMDiS/bin/Makefile.in b/AMDiS/bin/Makefile.in
index d42f6643..2cb803e6 100644
--- a/AMDiS/bin/Makefile.in
+++ b/AMDiS/bin/Makefile.in
@@ -39,6 +39,7 @@ host_triplet = @host@
 @USE_PARALLEL_DOMAIN_AMDIS_TRUE@am__append_1 = \
 @USE_PARALLEL_DOMAIN_AMDIS_TRUE@  $(SOURCE_DIR)/parallel/StdMpi.h $(SOURCE_DIR)/parallel/StdMpi.cc \
 @USE_PARALLEL_DOMAIN_AMDIS_TRUE@  $(SOURCE_DIR)/parallel/ParMetisPartitioner.h $(SOURCE_DIR)/parallel/ParMetisPartitioner.cc \
+@USE_PARALLEL_DOMAIN_AMDIS_TRUE@  $(SOURCE_DIR)/parallel/ZoltanPartitioner.h $(SOURCE_DIR)/parallel/ZoltanPartitioner.cc \
 @USE_PARALLEL_DOMAIN_AMDIS_TRUE@  $(SOURCE_DIR)/parallel/MeshDistributor.h $(SOURCE_DIR)/parallel/MeshDistributor.cc \
 @USE_PARALLEL_DOMAIN_AMDIS_TRUE@  $(SOURCE_DIR)/parallel/MeshPartitioner.h $(SOURCE_DIR)/parallel/MeshPartitioner.cc \
 @USE_PARALLEL_DOMAIN_AMDIS_TRUE@  $(SOURCE_DIR)/parallel/MeshManipulation.h $(SOURCE_DIR)/parallel/MeshManipulation.cc \
@@ -50,7 +51,9 @@ host_triplet = @host@
 @USE_PARALLEL_DOMAIN_AMDIS_TRUE@  $(SOURCE_DIR)/parallel/ElementObjectData.h $(SOURCE_DIR)/parallel/ElementObjectData.cc
 
 @USE_PARALLEL_DOMAIN_AMDIS_TRUE@am__append_2 = -DHAVE_PARALLEL_DOMAIN_AMDIS=1
-@USE_PARALLEL_DOMAIN_AMDIS_TRUE@am__append_3 = -I$(PETSC_DIR)/include -I$(PETSC_DIR)/$(PETSC_ARCH)/include
+@USE_PARALLEL_DOMAIN_AMDIS_TRUE@am__append_3 = -I$(PETSC_DIR)/include \
+@USE_PARALLEL_DOMAIN_AMDIS_TRUE@	-I$(PETSC_DIR)/$(PETSC_ARCH)/include \
+@USE_PARALLEL_DOMAIN_AMDIS_TRUE@	-I$(LIB_DIR)/zoltan_build/include
 @ENABLE_UMFPACK_TRUE@am__append_4 = -DHAVE_UMFPACK=1 -DMTL_HAS_UMFPACK
 @ENABLE_UMFPACK_TRUE@am__append_5 = -I$(LIB_DIR)/UFconfig \
 @ENABLE_UMFPACK_TRUE@	            -I$(LIB_DIR)/AMD/Include \
@@ -84,6 +87,8 @@ am__libamdis_la_SOURCES_DIST = $(SOURCE_DIR)/parallel/StdMpi.h \
 	$(SOURCE_DIR)/parallel/StdMpi.cc \
 	$(SOURCE_DIR)/parallel/ParMetisPartitioner.h \
 	$(SOURCE_DIR)/parallel/ParMetisPartitioner.cc \
+	$(SOURCE_DIR)/parallel/ZoltanPartitioner.h \
+	$(SOURCE_DIR)/parallel/ZoltanPartitioner.cc \
 	$(SOURCE_DIR)/parallel/MeshDistributor.h \
 	$(SOURCE_DIR)/parallel/MeshDistributor.cc \
 	$(SOURCE_DIR)/parallel/MeshPartitioner.h \
@@ -254,6 +259,7 @@ am__libamdis_la_SOURCES_DIST = $(SOURCE_DIR)/parallel/StdMpi.h \
 	$(SOURCE_DIR)/time/RosenbrockMethod.cc
 @USE_PARALLEL_DOMAIN_AMDIS_TRUE@am__objects_1 = libamdis_la-StdMpi.lo \
 @USE_PARALLEL_DOMAIN_AMDIS_TRUE@	libamdis_la-ParMetisPartitioner.lo \
+@USE_PARALLEL_DOMAIN_AMDIS_TRUE@	libamdis_la-ZoltanPartitioner.lo \
 @USE_PARALLEL_DOMAIN_AMDIS_TRUE@	libamdis_la-MeshDistributor.lo \
 @USE_PARALLEL_DOMAIN_AMDIS_TRUE@	libamdis_la-MeshPartitioner.lo \
 @USE_PARALLEL_DOMAIN_AMDIS_TRUE@	libamdis_la-MeshManipulation.lo \
@@ -861,6 +867,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-VtkWriter.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-ZeroOrderAssembler.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-ZeroOrderTerm.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-ZoltanPartitioner.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcompositeFEM_la-CFE_Integration.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcompositeFEM_la-CFE_NormAndErrorFcts.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcompositeFEM_la-CompositeFEMMethods.Plo@am__quote@
@@ -906,6 +913,13 @@ libamdis_la-ParMetisPartitioner.lo: $(SOURCE_DIR)/parallel/ParMetisPartitioner.c
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libamdis_la_CXXFLAGS) $(CXXFLAGS) -c -o libamdis_la-ParMetisPartitioner.lo `test -f '$(SOURCE_DIR)/parallel/ParMetisPartitioner.cc' || echo '$(srcdir)/'`$(SOURCE_DIR)/parallel/ParMetisPartitioner.cc
 
+libamdis_la-ZoltanPartitioner.lo: $(SOURCE_DIR)/parallel/ZoltanPartitioner.cc
+@am__fastdepCXX_TRUE@	if $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libamdis_la_CXXFLAGS) $(CXXFLAGS) -MT libamdis_la-ZoltanPartitioner.lo -MD -MP -MF "$(DEPDIR)/libamdis_la-ZoltanPartitioner.Tpo" -c -o libamdis_la-ZoltanPartitioner.lo `test -f '$(SOURCE_DIR)/parallel/ZoltanPartitioner.cc' || echo '$(srcdir)/'`$(SOURCE_DIR)/parallel/ZoltanPartitioner.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/libamdis_la-ZoltanPartitioner.Tpo" "$(DEPDIR)/libamdis_la-ZoltanPartitioner.Plo"; else rm -f "$(DEPDIR)/libamdis_la-ZoltanPartitioner.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$(SOURCE_DIR)/parallel/ZoltanPartitioner.cc' object='libamdis_la-ZoltanPartitioner.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libamdis_la_CXXFLAGS) $(CXXFLAGS) -c -o libamdis_la-ZoltanPartitioner.lo `test -f '$(SOURCE_DIR)/parallel/ZoltanPartitioner.cc' || echo '$(srcdir)/'`$(SOURCE_DIR)/parallel/ZoltanPartitioner.cc
+
 libamdis_la-MeshDistributor.lo: $(SOURCE_DIR)/parallel/MeshDistributor.cc
 @am__fastdepCXX_TRUE@	if $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libamdis_la_CXXFLAGS) $(CXXFLAGS) -MT libamdis_la-MeshDistributor.lo -MD -MP -MF "$(DEPDIR)/libamdis_la-MeshDistributor.Tpo" -c -o libamdis_la-MeshDistributor.lo `test -f '$(SOURCE_DIR)/parallel/MeshDistributor.cc' || echo '$(srcdir)/'`$(SOURCE_DIR)/parallel/MeshDistributor.cc; \
 @am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/libamdis_la-MeshDistributor.Tpo" "$(DEPDIR)/libamdis_la-MeshDistributor.Plo"; else rm -f "$(DEPDIR)/libamdis_la-MeshDistributor.Tpo"; exit 1; fi
diff --git a/AMDiS/other/include/Makefile_AMDiS.mk b/AMDiS/other/include/Makefile_AMDiS.mk
index 6707d314..87e1eae3 100644
--- a/AMDiS/other/include/Makefile_AMDiS.mk
+++ b/AMDiS/other/include/Makefile_AMDiS.mk
@@ -39,6 +39,7 @@ endif
 
 MPCCI_LIB = -L$(MPCCI_DIR)/lib/linux-x86-glibc22 -lmpcci
 PARMETIS_LIB = -L$(PARMETIS_DIR) -lparmetis -lmetis
+ZOLTAN_LIB = -L$(AMDIS_DIR)/lib/zoltan_build/lib -lzoltan
 
 LIBS += $(AMDIS_LIB) $(PNG_LIB)
 LIBS += -lboost_iostreams -lboost_filesystem -lboost_system -lboost_date_time
@@ -89,6 +90,7 @@ ifeq ($(strip $(USE_PARALLEL_AMDIS)), 1)
 	CPPFLAGS += -DHAVE_PARALLEL_DOMAIN_AMDIS
 	INCLUDES += $(PETSC_INCLUDE)
 	LIBS += $(PARMETIS_LIB) -lmpi $(PETSC_LIB)
+	LIBS += $(ZOLTAN_LIB)
 else
 	ifeq ($(strip $(USE_COMPILER)), gcc)
 		COMPILE = g++
diff --git a/AMDiS/src/ElInfo.h b/AMDiS/src/ElInfo.h
index e722b6e8..a811dcda 100644
--- a/AMDiS/src/ElInfo.h
+++ b/AMDiS/src/ElInfo.h
@@ -294,13 +294,13 @@ namespace AMDiS {
     }
 
     /// Sets ElInfo's \ref coord[i]. 
-    inline void setCoord(int i,WorldVector<double>& c) 
+    inline void setCoord(int i, WorldVector<double>& c) 
     { 
       coord[i] = c; 
     }
 
     /// Sets ElInfo's \ref coord. 
-    inline void setCoords(FixVec<WorldVector<double>,VERTEX >& c) 
+    inline void setCoords(FixVec<WorldVector<double>, VERTEX >& c) 
     { 
       coord = c; 
     }
@@ -412,7 +412,7 @@ namespace AMDiS {
     virtual double calcGrdLambda(DimVec<WorldVector<double> >& grd_lam) = 0;
 
     /** \brief
-     * calculates a normal of the given side (1d,2d: edge, 3d: face) of \ref element.
+     * calculates a normal of the given side (1d, 2d: edge, 3d: face) of \ref element.
      * Returns the absolute value of the determinant of the
      * transformation to the reference element.
      * pure virtual => must be overriden in sub-class.
diff --git a/AMDiS/src/parallel/MeshDistributor.cc b/AMDiS/src/parallel/MeshDistributor.cc
index 132595e2..f9b9cedf 100644
--- a/AMDiS/src/parallel/MeshDistributor.cc
+++ b/AMDiS/src/parallel/MeshDistributor.cc
@@ -17,6 +17,7 @@
 #include <stdint.h>
 #include <boost/lexical_cast.hpp>
 #include <boost/filesystem.hpp>
+#include <zoltan_cpp.h>
 
 #include "parallel/MeshDistributor.h"
 #include "parallel/MeshManipulation.h"
@@ -24,6 +25,7 @@
 #include "parallel/StdMpi.h"
 #include "parallel/MeshPartitioner.h"
 #include "parallel/ParMetisPartitioner.h"
+#include "parallel/ZoltanPartitioner.h"
 #include "parallel/MpiHelper.h"
 #include "io/ElementFileWriter.h"
 #include "io/MacroInfo.h"
@@ -94,7 +96,8 @@ namespace AMDiS {
     GET_PARAMETER(0, name + "->log main rank", "%d", &tmp);
     Msg::outputMainRank = (tmp > 0);
 
-    partitioner = new ParMetisPartitioner(&mpiComm);
+    //    partitioner = new ParMetisPartitioner(&mpiComm);
+    partitioner = new ZoltanPartitioner(&mpiComm);
   }
 
 
@@ -108,6 +111,11 @@ namespace AMDiS {
     TEST_EXIT(feSpace)("No FE space has been defined for the mesh distributor!\n");
     TEST_EXIT(mesh)("No mesh has been defined for the mesh distributor!\n");
 
+    int a;
+    char *b;
+    float zoltanVersion;
+    Zoltan_Initialize(a, &b, &zoltanVersion);
+
     elObjects.setFeSpace(feSpace);
 
     // If the problem has been already read from a file, we need only to set
diff --git a/AMDiS/src/parallel/MeshPartitioner.h b/AMDiS/src/parallel/MeshPartitioner.h
index a288062c..1b410280 100644
--- a/AMDiS/src/parallel/MeshPartitioner.h
+++ b/AMDiS/src/parallel/MeshPartitioner.h
@@ -77,6 +77,11 @@ namespace AMDiS {
       mapLocalGlobal = m;
     }
 
+    Mesh *getMesh()
+    {
+      return mesh;
+    }
+
     map<int, bool>& getElementInRank()
     {
       return elementInRank;
diff --git a/AMDiS/src/parallel/ParMetisPartitioner.cc b/AMDiS/src/parallel/ParMetisPartitioner.cc
index c59a85fe..8676a8b1 100644
--- a/AMDiS/src/parallel/ParMetisPartitioner.cc
+++ b/AMDiS/src/parallel/ParMetisPartitioner.cc
@@ -11,6 +11,8 @@
 
 
 #include <queue>
+#include <mpi.h>
+
 #include "parallel/ParMetisPartitioner.h"
 #include "parallel/MpiHelper.h"
 #include "Serializer.h"
@@ -20,7 +22,7 @@
 #include "Element.h"
 #include "FixVec.h"
 #include "DOFVector.h"
-#include "mpi.h"
+
 
 namespace AMDiS {
 
@@ -542,7 +544,7 @@ namespace AMDiS {
 	 it != elementInRank.end(); ++it)
       elementInRank[it->first] = false;
 
-    // Create map which stores for each element index on ther partitioning level
+    // Create map which stores for each element index on macro level
     // if the element is in the partition of this rank.
     recvElements.clear();
     for (int i = 0; i < mpiSize; i++) {
diff --git a/AMDiS/src/parallel/ParMetisPartitioner.h b/AMDiS/src/parallel/ParMetisPartitioner.h
index 3b11c09a..092b3daa 100644
--- a/AMDiS/src/parallel/ParMetisPartitioner.h
+++ b/AMDiS/src/parallel/ParMetisPartitioner.h
@@ -20,16 +20,17 @@
 
 /** \file ParMetisPartitioner.h */
 
-#ifndef AMDIS_PARMETISADAPTER_H
-#define AMDIS_PARMETISADAPTER_H
+#ifndef AMDIS_PARMETIS_PARTITIONER_H
+#define AMDIS_PARMETIS_PARTITIONER_H
 
 #include <map>
 #include <set>
+#include <parmetis.h>
+#include <mpi.h>
+
 #include "AMDiS_fwd.h"
 #include "Global.h"
 #include "parallel/MeshPartitioner.h"
-#include "parmetis.h"
-#include "mpi.h"
 
 namespace AMDiS {
 
@@ -174,10 +175,11 @@ namespace AMDiS {
 
     ~ParMetisPartitioner();
 
+    /// \ref MeshPartitioner::partition
     bool partition(map<int, double> &elemWeights,
 		   PartitionMode mode = INITIAL);
 
-    /// Creates a map which stores for each element the rank that owns this element.
+    /// \ref MeshPartitioner::getPartitionMap
     void getPartitionMap(map<int, int> &partitionMap);
 
     void setItr(float value)
-- 
GitLab