From c4f4223d15bcab3c2ee1d48cfb06c1db4c53b8da Mon Sep 17 00:00:00 2001
From: Thomas Witkowski <thomas.witkowski@gmx.de>
Date: Mon, 24 Jan 2011 10:10:15 +0000
Subject: [PATCH] Abstract interface for mesh partitioner.

---
 AMDiS/CMakeLists.txt                      |   1 +
 AMDiS/bin/Makefile.am                     |   1 +
 AMDiS/bin/Makefile.in                     |  12 +++
 AMDiS/libtool                             |  64 ++++++------
 AMDiS/src/Serializer.h                    |   3 +
 AMDiS/src/parallel/MeshDistributor.cc     | 104 +++----------------
 AMDiS/src/parallel/MeshDistributor.h      |  11 +-
 AMDiS/src/parallel/MeshPartitioner.cc     |  62 ++++++++++++
 AMDiS/src/parallel/MeshPartitioner.h      | 109 ++++++++++++++++++++
 AMDiS/src/parallel/ParMetisPartitioner.cc | 116 ++--------------------
 AMDiS/src/parallel/ParMetisPartitioner.h  |  83 ++++------------
 AMDiS/src/parallel/ParallelDebug.cc       |   2 +-
 12 files changed, 262 insertions(+), 306 deletions(-)
 create mode 100644 AMDiS/src/parallel/MeshPartitioner.cc
 create mode 100644 AMDiS/src/parallel/MeshPartitioner.h

diff --git a/AMDiS/CMakeLists.txt b/AMDiS/CMakeLists.txt
index f56f4fee..f7ac49d2 100644
--- a/AMDiS/CMakeLists.txt
+++ b/AMDiS/CMakeLists.txt
@@ -177,6 +177,7 @@ if(ENABLE_PARALLEL_DOMAIN)
 	SET(PARALLEL_DOMAIN_AMDIS_SRC
                 ${SOURCE_DIR}/parallel/ParMetisPartitioner.cc
 		${SOURCE_DIR}/parallel/MeshDistributor.cc 
+		${SOURCE_DIR}/parallel/MeshPartitioner.cc
 		${SOURCE_DIR}/parallel/MeshManipulation.cc
 		${SOURCE_DIR}/parallel/StdMpi.cc
 		${SOURCE_DIR}/parallel/ParallelDebug.cc
diff --git a/AMDiS/bin/Makefile.am b/AMDiS/bin/Makefile.am
index e9f356fd..bc35ae7a 100644
--- a/AMDiS/bin/Makefile.am
+++ b/AMDiS/bin/Makefile.am
@@ -18,6 +18,7 @@ if USE_PARALLEL_DOMAIN_AMDIS
   $(SOURCE_DIR)/parallel/StdMpi.h $(SOURCE_DIR)/parallel/StdMpi.cc \
   $(SOURCE_DIR)/parallel/ParMetisPartitioner.h $(SOURCE_DIR)/parallel/ParMetisPartitioner.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 \
   $(SOURCE_DIR)/parallel/ParallelDebug.h $(SOURCE_DIR)/parallel/ParallelDebug.cc \
   $(SOURCE_DIR)/parallel/ParallelProblemStatBase.h \
diff --git a/AMDiS/bin/Makefile.in b/AMDiS/bin/Makefile.in
index 9aa0041a..82e32247 100644
--- a/AMDiS/bin/Makefile.in
+++ b/AMDiS/bin/Makefile.in
@@ -40,6 +40,7 @@ host_triplet = @host@
 @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/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 \
 @USE_PARALLEL_DOMAIN_AMDIS_TRUE@  $(SOURCE_DIR)/parallel/ParallelDebug.h $(SOURCE_DIR)/parallel/ParallelDebug.cc \
 @USE_PARALLEL_DOMAIN_AMDIS_TRUE@  $(SOURCE_DIR)/parallel/ParallelProblemStatBase.h \
@@ -85,6 +86,8 @@ am__libamdis_la_SOURCES_DIST = $(SOURCE_DIR)/parallel/StdMpi.h \
 	$(SOURCE_DIR)/parallel/ParMetisPartitioner.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 \
 	$(SOURCE_DIR)/parallel/ParallelDebug.h \
@@ -252,6 +255,7 @@ am__libamdis_la_SOURCES_DIST = $(SOURCE_DIR)/parallel/StdMpi.h \
 @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-MeshDistributor.lo \
+@USE_PARALLEL_DOMAIN_AMDIS_TRUE@	libamdis_la-MeshPartitioner.lo \
 @USE_PARALLEL_DOMAIN_AMDIS_TRUE@	libamdis_la-MeshManipulation.lo \
 @USE_PARALLEL_DOMAIN_AMDIS_TRUE@	libamdis_la-ParallelDebug.lo \
 @USE_PARALLEL_DOMAIN_AMDIS_TRUE@	libamdis_la-ParallelProblemStatBase.lo \
@@ -799,6 +803,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-Mesh.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-MeshDistributor.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-MeshManipulation.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-MeshPartitioner.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-MeshStructure.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-MpiHelper.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-NonLinUpdater.Plo@am__quote@
@@ -906,6 +911,13 @@ libamdis_la-MeshDistributor.lo: $(SOURCE_DIR)/parallel/MeshDistributor.cc
 @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-MeshDistributor.lo `test -f '$(SOURCE_DIR)/parallel/MeshDistributor.cc' || echo '$(srcdir)/'`$(SOURCE_DIR)/parallel/MeshDistributor.cc
 
+libamdis_la-MeshPartitioner.lo: $(SOURCE_DIR)/parallel/MeshPartitioner.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-MeshPartitioner.lo -MD -MP -MF "$(DEPDIR)/libamdis_la-MeshPartitioner.Tpo" -c -o libamdis_la-MeshPartitioner.lo `test -f '$(SOURCE_DIR)/parallel/MeshPartitioner.cc' || echo '$(srcdir)/'`$(SOURCE_DIR)/parallel/MeshPartitioner.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/libamdis_la-MeshPartitioner.Tpo" "$(DEPDIR)/libamdis_la-MeshPartitioner.Plo"; else rm -f "$(DEPDIR)/libamdis_la-MeshPartitioner.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$(SOURCE_DIR)/parallel/MeshPartitioner.cc' object='libamdis_la-MeshPartitioner.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-MeshPartitioner.lo `test -f '$(SOURCE_DIR)/parallel/MeshPartitioner.cc' || echo '$(srcdir)/'`$(SOURCE_DIR)/parallel/MeshPartitioner.cc
+
 libamdis_la-MeshManipulation.lo: $(SOURCE_DIR)/parallel/MeshManipulation.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-MeshManipulation.lo -MD -MP -MF "$(DEPDIR)/libamdis_la-MeshManipulation.Tpo" -c -o libamdis_la-MeshManipulation.lo `test -f '$(SOURCE_DIR)/parallel/MeshManipulation.cc' || echo '$(srcdir)/'`$(SOURCE_DIR)/parallel/MeshManipulation.cc; \
 @am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/libamdis_la-MeshManipulation.Tpo" "$(DEPDIR)/libamdis_la-MeshManipulation.Plo"; else rm -f "$(DEPDIR)/libamdis_la-MeshManipulation.Tpo"; exit 1; fi
diff --git a/AMDiS/libtool b/AMDiS/libtool
index 6a7f3c76..ace48e58 100755
--- a/AMDiS/libtool
+++ b/AMDiS/libtool
@@ -30,10 +30,10 @@
 # the same distribution terms that you use for the rest of that program.
 
 # A sed program that does not truncate output.
-SED="/bin/sed"
+SED="/usr/bin/sed"
 
 # Sed that helps us avoid accidentally triggering echo(1) options like -n.
-Xsed="/bin/sed -e 1s/^X//"
+Xsed="/usr/bin/sed -e 1s/^X//"
 
 # The HP-UX ksh and POSIX shell print the target directory to stdout
 # if CDPATH is set.
@@ -44,7 +44,7 @@ available_tags=" CXX F77"
 
 # ### BEGIN LIBTOOL CONFIG
 
-# Libtool was configured on host NWRW15:
+# Libtool was configured on host p1q024:
 
 # Shell to use when invoking shell scripts.
 SHELL="/bin/sh"
@@ -66,12 +66,12 @@ fast_install=yes
 
 # The host system.
 host_alias=
-host=i686-pc-linux-gnu
+host=x86_64-unknown-linux-gnu
 host_os=linux-gnu
 
 # The build system.
 build_alias=
-build=i686-pc-linux-gnu
+build=x86_64-unknown-linux-gnu
 build_os=linux-gnu
 
 # An echo program that does not interpret backslashes.
@@ -82,13 +82,13 @@ AR="ar"
 AR_FLAGS="cru"
 
 # A C compiler.
-LTCC="gcc"
+LTCC="/licsoft/libraries/openmpi/1.2.6/64bit/bin/mpicc"
 
 # LTCC compiler flags.
 LTCFLAGS="-g -O2"
 
 # A language-specific compiler.
-CC="gcc"
+CC="/licsoft/libraries/openmpi/1.2.6/64bit/bin/mpicc"
 
 # Is the compiler the GNU C compiler?
 with_gcc=yes
@@ -97,7 +97,7 @@ with_gcc=yes
 EGREP="grep -E"
 
 # The linker used to build libraries.
-LD="/usr/bin/ld"
+LD="/usr/x86_64-suse-linux/bin/ld -m elf_x86_64"
 
 # Whether we need hard or soft links.
 LN_S="ln -s"
@@ -171,7 +171,7 @@ dlopen_self=unknown
 dlopen_self_static=unknown
 
 # Compiler flag to prevent dynamic linking.
-link_static_flag="-static"
+link_static_flag=""
 
 # Compiler flag to turn off builtin functions.
 no_builtin_flag=" -fno-builtin"
@@ -325,10 +325,10 @@ variables_saved_for_relink="PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COM
 link_all_deplibs=unknown
 
 # Compile-time system search path for libraries
-sys_lib_search_path_spec=" /u/witkowski/local/lib/i386-redhat-linux/4.1.2/ /u/witkowski/local/lib/ /u/witkowski/local/intel/mkl/10.0.1.014/lib/32/i386-redhat-linux/4.1.2/ /u/witkowski/local/intel/mkl/10.0.1.014/lib/32/ /usr/lib/gcc/i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../i386-redhat-linux/lib/i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../i386-redhat-linux/lib/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../ /lib/i386-redhat-linux/4.1.2/ /lib/ /usr/lib/i386-redhat-linux/4.1.2/ /usr/lib/"
+sys_lib_search_path_spec=" /fastfs/wir/local/lib/x86_64-suse-linux/4.1.2/ /fastfs/wir/local/lib/../lib64/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/ /usr/lib/gcc/x86_64-suse-linux/4.1.2/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../x86_64-suse-linux/lib/x86_64-suse-linux/4.1.2/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../x86_64-suse-linux/lib/../lib64/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../x86_64-suse-linux/4.1.2/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../lib64/ /lib/x86_64-suse-linux/4.1.2/ /lib/../lib64/ /usr/lib/x86_64-suse-linux/4.1.2/ /usr/lib/../lib64/ /fastfs/wir/local/lib/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../x86_64-suse-linux/lib/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../ /lib/ /usr/lib/"
 
 # Run-time system search path for libraries
-sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/mysql /usr/lib/octave-2.9.9 /usr/lib/qt-3.3/lib /usr/lib/qt4/lib /usr/lib/xulrunner-1.9.2 "
+sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/X11R6/lib64/Xaw3d /usr/X11R6/lib64 /usr/X11R6/lib/Xaw3d /usr/X11R6/lib /usr/x86_64-suse-linux/lib /usr/local/lib64 /usr/local/lib /opt/kde3/lib64 /opt/kde3/lib /opt/gnome/lib64 /opt/gnome/lib /lib64 /lib /usr/lib64 /usr/lib /opt/cluster/intel/cce/9.1.042/lib /opt/cluster/intel/fce/9.1.036/lib /opt/cluster/Pathscale3.0/lib/2.9.99 /opt/cluster/Pathscale3.0/lib/2.9.99/32 /work/licsoft/compilers/pgi/linux86-64/6.2/lib /work/licsoft/compilers/pgi/linux86-64/6.2/libso "
 
 # Fix the shell variable $srcfile for the compiler.
 fix_srcfile_path=""
@@ -6760,7 +6760,7 @@ build_old_libs=`case $build_libtool_libs in yes) $echo no;; *) $echo yes;; esac`
 # End:
 # ### BEGIN LIBTOOL TAG CONFIG: CXX
 
-# Libtool was configured on host NWRW15:
+# Libtool was configured on host p1q024:
 
 # Shell to use when invoking shell scripts.
 SHELL="/bin/sh"
@@ -6782,12 +6782,12 @@ fast_install=yes
 
 # The host system.
 host_alias=
-host=i686-pc-linux-gnu
+host=x86_64-unknown-linux-gnu
 host_os=linux-gnu
 
 # The build system.
 build_alias=
-build=i686-pc-linux-gnu
+build=x86_64-unknown-linux-gnu
 build_os=linux-gnu
 
 # An echo program that does not interpret backslashes.
@@ -6798,13 +6798,13 @@ AR="ar"
 AR_FLAGS="cru"
 
 # A C compiler.
-LTCC="gcc"
+LTCC="/licsoft/libraries/openmpi/1.2.6/64bit/bin/mpicc"
 
 # LTCC compiler flags.
 LTCFLAGS="-g -O2"
 
 # A language-specific compiler.
-CC="g++"
+CC="/licsoft/libraries/openmpi/1.2.6/64bit/bin/mpicxx"
 
 # Is the compiler the GNU C compiler?
 with_gcc=yes
@@ -6813,7 +6813,7 @@ with_gcc=yes
 EGREP="grep -E"
 
 # The linker used to build libraries.
-LD="/usr/bin/ld"
+LD="/usr/x86_64-suse-linux/bin/ld -m elf_x86_64"
 
 # Whether we need hard or soft links.
 LN_S="ln -s"
@@ -6887,7 +6887,7 @@ dlopen_self=unknown
 dlopen_self_static=unknown
 
 # Compiler flag to prevent dynamic linking.
-link_static_flag="-static"
+link_static_flag=""
 
 # Compiler flag to turn off builtin functions.
 no_builtin_flag=" -fno-builtin"
@@ -6942,11 +6942,11 @@ striplib="strip --strip-unneeded"
 
 # Dependencies to place before the objects being linked to create a
 # shared library.
-predep_objects="/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crti.o /usr/lib/gcc/i386-redhat-linux/4.1.2/crtbeginS.o"
+predep_objects="/usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../lib64/crti.o /usr/lib64/gcc/x86_64-suse-linux/4.1.2/crtbeginS.o"
 
 # Dependencies to place after the objects being linked to create a
 # shared library.
-postdep_objects="/usr/lib/gcc/i386-redhat-linux/4.1.2/crtendS.o /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crtn.o"
+postdep_objects="/usr/lib64/gcc/x86_64-suse-linux/4.1.2/crtendS.o /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../lib64/crtn.o"
 
 # Dependencies to place before the objects being linked to create a
 # shared library.
@@ -6954,11 +6954,11 @@ predeps=""
 
 # Dependencies to place after the objects being linked to create a
 # shared library.
-postdeps="-lstdc++ -lm -lgcc_s -lc -lgcc_s"
+postdeps="-lmpi_cxx -lmpi -lopen-rte -lopen-pal -libverbs -lrt -lnuma -ldl -lnsl -lutil -ldl -lstdc++ -lm -lgcc_s -lpthread -lc -lgcc_s"
 
 # The library search path used internally by the compiler when linking
 # a shared library.
-compiler_lib_search_path="-L/u/witkowski/local/lib -L/u/witkowski/local/intel/mkl/10.0.1.014/lib/32 -L/usr/lib/gcc/i386-redhat-linux/4.1.2 -L/usr/lib/gcc/i386-redhat-linux/4.1.2 -L/usr/lib/gcc/i386-redhat-linux/4.1.2/../../.."
+compiler_lib_search_path="-L/usr/lib64 -L/licsoft/libraries/openmpi/1.2.6/64bit/lib -L/usr/lib64/gcc/x86_64-suse-linux/4.1.2 -L/usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/fastfs/wir/local/lib -L/usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../x86_64-suse-linux/lib -L/usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../.."
 
 # Method to check whether dependent libraries are shared objects.
 deplibs_check_method="pass_all"
@@ -7038,10 +7038,10 @@ variables_saved_for_relink="PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COM
 link_all_deplibs=unknown
 
 # Compile-time system search path for libraries
-sys_lib_search_path_spec=" /u/witkowski/local/lib/i386-redhat-linux/4.1.2/ /u/witkowski/local/lib/ /u/witkowski/local/intel/mkl/10.0.1.014/lib/32/i386-redhat-linux/4.1.2/ /u/witkowski/local/intel/mkl/10.0.1.014/lib/32/ /usr/lib/gcc/i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../i386-redhat-linux/lib/i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../i386-redhat-linux/lib/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../ /lib/i386-redhat-linux/4.1.2/ /lib/ /usr/lib/i386-redhat-linux/4.1.2/ /usr/lib/"
+sys_lib_search_path_spec=" /fastfs/wir/local/lib/x86_64-suse-linux/4.1.2/ /fastfs/wir/local/lib/../lib64/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/ /usr/lib/gcc/x86_64-suse-linux/4.1.2/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../x86_64-suse-linux/lib/x86_64-suse-linux/4.1.2/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../x86_64-suse-linux/lib/../lib64/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../x86_64-suse-linux/4.1.2/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../lib64/ /lib/x86_64-suse-linux/4.1.2/ /lib/../lib64/ /usr/lib/x86_64-suse-linux/4.1.2/ /usr/lib/../lib64/ /fastfs/wir/local/lib/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../x86_64-suse-linux/lib/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../ /lib/ /usr/lib/"
 
 # Run-time system search path for libraries
-sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/mysql /usr/lib/octave-2.9.9 /usr/lib/qt-3.3/lib /usr/lib/qt4/lib /usr/lib/xulrunner-1.9.2 "
+sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/X11R6/lib64/Xaw3d /usr/X11R6/lib64 /usr/X11R6/lib/Xaw3d /usr/X11R6/lib /usr/x86_64-suse-linux/lib /usr/local/lib64 /usr/local/lib /opt/kde3/lib64 /opt/kde3/lib /opt/gnome/lib64 /opt/gnome/lib /lib64 /lib /usr/lib64 /usr/lib /opt/cluster/intel/cce/9.1.042/lib /opt/cluster/intel/fce/9.1.036/lib /opt/cluster/Pathscale3.0/lib/2.9.99 /opt/cluster/Pathscale3.0/lib/2.9.99/32 /work/licsoft/compilers/pgi/linux86-64/6.2/lib /work/licsoft/compilers/pgi/linux86-64/6.2/libso "
 
 # Fix the shell variable $srcfile for the compiler.
 fix_srcfile_path=""
@@ -7065,7 +7065,7 @@ include_expsyms=""
 
 # ### BEGIN LIBTOOL TAG CONFIG: F77
 
-# Libtool was configured on host NWRW15:
+# Libtool was configured on host p1q024:
 
 # Shell to use when invoking shell scripts.
 SHELL="/bin/sh"
@@ -7087,12 +7087,12 @@ fast_install=yes
 
 # The host system.
 host_alias=
-host=i686-pc-linux-gnu
+host=x86_64-unknown-linux-gnu
 host_os=linux-gnu
 
 # The build system.
 build_alias=
-build=i686-pc-linux-gnu
+build=x86_64-unknown-linux-gnu
 build_os=linux-gnu
 
 # An echo program that does not interpret backslashes.
@@ -7103,7 +7103,7 @@ AR="ar"
 AR_FLAGS="cru"
 
 # A C compiler.
-LTCC="gcc"
+LTCC="/licsoft/libraries/openmpi/1.2.6/64bit/bin/mpicc"
 
 # LTCC compiler flags.
 LTCFLAGS="-g -O2"
@@ -7112,13 +7112,13 @@ LTCFLAGS="-g -O2"
 CC="g77"
 
 # Is the compiler the GNU C compiler?
-with_gcc=yes
+with_gcc=
 
 # An ERE matcher.
 EGREP="grep -E"
 
 # The linker used to build libraries.
-LD="/usr/bin/ld"
+LD="/usr/x86_64-suse-linux/bin/ld -m elf_x86_64"
 
 # Whether we need hard or soft links.
 LN_S="ln -s"
@@ -7346,10 +7346,10 @@ variables_saved_for_relink="PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COM
 link_all_deplibs=unknown
 
 # Compile-time system search path for libraries
-sys_lib_search_path_spec=" /u/witkowski/local/lib/i386-redhat-linux/3.4.6/ /u/witkowski/local/lib/ /u/witkowski/local/intel/mkl/10.0.1.014/lib/32/i386-redhat-linux/3.4.6/ /u/witkowski/local/intel/mkl/10.0.1.014/lib/32/ /usr/lib/gcc/i386-redhat-linux/3.4.6/ /usr/lib/gcc/i386-redhat-linux/3.4.6/ /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../i386-redhat-linux/lib/i386-redhat-linux/3.4.6/ /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../i386-redhat-linux/lib/ /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../i386-redhat-linux/3.4.6/ /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../ /lib/i386-redhat-linux/3.4.6/ /lib/ /usr/lib/i386-redhat-linux/3.4.6/ /usr/lib/"
+sys_lib_search_path_spec=" /fastfs/wir/local/lib/x86_64-suse-linux/3.3.5/ /fastfs/wir/local/lib/ /usr/lib64/gcc-lib/x86_64-suse-linux/3.3.5/ /usr/lib/gcc/x86_64-suse-linux/3.3.5/ /usr/lib64/gcc-lib/x86_64-suse-linux/3.3.5/../../../../x86_64-suse-linux/lib/x86_64-suse-linux/3.3.5/ /usr/lib64/gcc-lib/x86_64-suse-linux/3.3.5/../../../../x86_64-suse-linux/lib/ /usr/lib64/gcc-lib/x86_64-suse-linux/3.3.5/../../../x86_64-suse-linux/3.3.5/ /usr/lib64/gcc-lib/x86_64-suse-linux/3.3.5/../../../ /lib/x86_64-suse-linux/3.3.5/ /lib/ /usr/lib/x86_64-suse-linux/3.3.5/ /usr/lib/"
 
 # Run-time system search path for libraries
-sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/mysql /usr/lib/octave-2.9.9 /usr/lib/qt-3.3/lib /usr/lib/qt4/lib /usr/lib/xulrunner-1.9.2 "
+sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/X11R6/lib64/Xaw3d /usr/X11R6/lib64 /usr/X11R6/lib/Xaw3d /usr/X11R6/lib /usr/x86_64-suse-linux/lib /usr/local/lib64 /usr/local/lib /opt/kde3/lib64 /opt/kde3/lib /opt/gnome/lib64 /opt/gnome/lib /lib64 /lib /usr/lib64 /usr/lib /opt/cluster/intel/cce/9.1.042/lib /opt/cluster/intel/fce/9.1.036/lib /opt/cluster/Pathscale3.0/lib/2.9.99 /opt/cluster/Pathscale3.0/lib/2.9.99/32 /work/licsoft/compilers/pgi/linux86-64/6.2/lib /work/licsoft/compilers/pgi/linux86-64/6.2/libso "
 
 # Fix the shell variable $srcfile for the compiler.
 fix_srcfile_path=""
diff --git a/AMDiS/src/Serializer.h b/AMDiS/src/Serializer.h
index 4ef1a772..dbc0f30a 100644
--- a/AMDiS/src/Serializer.h
+++ b/AMDiS/src/Serializer.h
@@ -81,6 +81,9 @@ namespace AMDiS {
     {
       FUNCNAME("Serializer::writeFiles()");
 
+      TEST_EXIT(tsModulo > 0)
+	("Parameter 'write every ith timestep' must be larger than zero!\n");
+
       timestepNumber++;
       timestepNumber %= tsModulo;
       if ((timestepNumber != 0) && !force)
diff --git a/AMDiS/src/parallel/MeshDistributor.cc b/AMDiS/src/parallel/MeshDistributor.cc
index 9c64ffde..3afa0c58 100644
--- a/AMDiS/src/parallel/MeshDistributor.cc
+++ b/AMDiS/src/parallel/MeshDistributor.cc
@@ -22,6 +22,7 @@
 #include "parallel/MeshManipulation.h"
 #include "parallel/ParallelDebug.h"
 #include "parallel/StdMpi.h"
+#include "parallel/MeshPartitioner.h"
 #include "parallel/ParMetisPartitioner.h"
 #include "parallel/MpiHelper.h"
 #include "io/ElementFileWriter.h"
@@ -148,12 +149,12 @@ namespace AMDiS {
     setInitialElementWeights();
 
     // and now partition the mesh    
-    partitioner->fillCoarsePartitionVec(&oldPartitionVec);
+    partitioner->getPartitionMap(oldPartitionMap);
 
     bool partitioningSucceed = partitioner->partition(elemWeights, INITIAL);
     TEST_EXIT(partitioningSucceed)("Initial partitioning does not work!\n");
 
-    partitioner->fillCoarsePartitionVec(&partitionVec);
+    partitioner->getPartitionMap(partitionMap);
 
 
 #if (DEBUG != 0)
@@ -928,13 +929,12 @@ namespace AMDiS {
     // === Run ParMETiS to calculate a new mesh partitioning.  ===
 
     partitioner->useLocalGlobalDofMap(&mapLocalGlobalDofs);
-    bool partitioningSucceed =
-      partitioner->partition(elemWeights, ADAPTIVE_REPART, 1000.0);
+    bool partitioningSucceed = partitioner->partition(elemWeights, ADAPTIVE_REPART);
     if (!partitioningSucceed) {
       MSG("ParMETIS created empty partition!\n");
       return;
     }
-    oldPartitionVec = partitionVec;
+    oldPartitionMap = partitionMap;
 
 
     // === Create map that maps macro element indices to pointers to the ===
@@ -1112,93 +1112,13 @@ namespace AMDiS {
     MeshManipulation meshManipulation(feSpace);
     meshManipulation.deleteDoubleDofs(newMacroEl, elObjects);
 
-#if 0
-    {
-    TraverseStack stack;
-    ElInfo *elInfo = stack.traverseFirst(mesh, 0, Mesh::CALL_EL_LEVEL);
-    while (elInfo) {
-      MSG("HAVE MACRO EL %d\n", elInfo->getMacroElement()->getIndex());
-
-      elInfo = stack.traverseNext(elInfo);
-    }
-    }
-
-    {
-    TraverseStack stack;
-    ElInfo *elInfo = stack.traverseFirst(mesh, -1, Mesh::CALL_LEAF_EL);
-    while (elInfo) {
-      MSG("A-CHECK DOFs ON %d: %d %d %d %d\n", 
-	  elInfo->getElement()->getIndex(),
-	  elInfo->getElement()->getDof(0, 0),
-	  elInfo->getElement()->getDof(1, 0),
-	  elInfo->getElement()->getDof(2, 0),
-	  elInfo->getElement()->getDof(3, 0));
-
-      elInfo = stack.traverseNext(elInfo);
-    }
-    }
-#endif
-
     mesh->dofCompress();
-    partitioner->fillCoarsePartitionVec(&partitionVec);
-
-#if 0
-    {
-    TraverseStack stack;
-    ElInfo *elInfo = stack.traverseFirst(mesh, -1, Mesh::CALL_LEAF_EL);
-    while (elInfo) {
-      MSG("B-CHECK DOFs ON %d: %d %d %d %d\n", 
-	  elInfo->getElement()->getIndex(),
-	  elInfo->getElement()->getDof(0, 0),
-	  elInfo->getElement()->getDof(1, 0),
-	  elInfo->getElement()->getDof(2, 0),
-	  elInfo->getElement()->getDof(3, 0));
-
-      elInfo = stack.traverseNext(elInfo);
-    }
-    }
-#endif
+    partitioner->getPartitionMap(partitionMap);
 
     updateInteriorBoundaryInfo();
 
-#if 0
-    {
-    TraverseStack stack;
-    ElInfo *elInfo = stack.traverseFirst(mesh, -1, Mesh::CALL_LEAF_EL);
-    while (elInfo) {
-      MSG("C-CHECK DOFs ON %d: %d %d %d %d\n", 
-	  elInfo->getElement()->getIndex(),
-	  elInfo->getElement()->getDof(0, 0),
-	  elInfo->getElement()->getDof(1, 0),
-	  elInfo->getElement()->getDof(2, 0),
-	  elInfo->getElement()->getDof(3, 0));
-
-      elInfo = stack.traverseNext(elInfo);
-    }
-    }
-#endif
-
     updateLocalGlobalNumbering();
 
-#if 0
-    {
-    TraverseStack stack;
-    ElInfo *elInfo = stack.traverseFirst(mesh, -1, Mesh::CALL_LEAF_EL);
-    while (elInfo) {
-      MSG("D-CHECK DOFs ON %d: %d %d %d %d\n", 
-	  elInfo->getElement()->getIndex(),
-	  elInfo->getElement()->getDof(0, 0),
-	  elInfo->getElement()->getDof(1, 0),
-	  elInfo->getElement()->getDof(2, 0),
-	  elInfo->getElement()->getDof(3, 0));
-
-      elInfo = stack.traverseNext(elInfo);
-    }
-    }
-#endif
-
-
-
 #if (DEBUG != 0)
     MSG("AMDiS runs in debug mode, so make some test ...\n");
 
@@ -1229,7 +1149,7 @@ namespace AMDiS {
   {
     FUNCNAME("MeshDistributor::updateInteriorBoundaryInfo()");
 
-    elObjects.createRankData(partitionVec);
+    elObjects.createRankData(partitionMap);
     createBoundaryData();
 
 #if (DEBUG != 0)
@@ -1270,7 +1190,7 @@ namespace AMDiS {
 
 
     // === Create mesh element data for this rank. ===
-    elObjects.createRankData(partitionVec);
+    elObjects.createRankData(partitionMap);
   }
 
 
@@ -1996,8 +1916,8 @@ namespace AMDiS {
     partitioner->serialize(out);
 
     SerUtil::serialize(out, elemWeights);
-    SerUtil::serialize(out, partitionVec);
-    SerUtil::serialize(out, oldPartitionVec);
+    SerUtil::serialize(out, partitionMap);
+    SerUtil::serialize(out, oldPartitionMap);
     SerUtil::serialize(out, nRankDofs);
     SerUtil::serialize(out, nOverallDofs);
 
@@ -2037,8 +1957,8 @@ namespace AMDiS {
     partitioner->deserialize(in);
 
     SerUtil::deserialize(in, elemWeights);
-    SerUtil::deserialize(in, partitionVec);
-    SerUtil::deserialize(in, oldPartitionVec);
+    SerUtil::deserialize(in, partitionMap);
+    SerUtil::deserialize(in, oldPartitionMap);
     SerUtil::deserialize(in, nRankDofs);    
     SerUtil::deserialize(in, nOverallDofs);
 
diff --git a/AMDiS/src/parallel/MeshDistributor.h b/AMDiS/src/parallel/MeshDistributor.h
index 6bf1eba4..1e760b56 100644
--- a/AMDiS/src/parallel/MeshDistributor.h
+++ b/AMDiS/src/parallel/MeshDistributor.h
@@ -29,6 +29,7 @@
 #include <vector>
 #include <mpi.h>
 
+#include "parallel/MeshPartitioner.h"
 #include "parallel/InteriorBoundary.h"
 #include "Global.h"
 #include "ProblemTimeInterface.h"
@@ -43,8 +44,6 @@ namespace AMDiS {
 
   using namespace std;
   
-  class ParMetisPartitioner;
-
   class MeshDistributor
   {
   protected:
@@ -437,8 +436,8 @@ namespace AMDiS {
     /// Info level.
     int info;
 
-    /// Pointer to the paritioner which is used to devide a mesh into partitions.
-    ParMetisPartitioner *partitioner;
+    /// Pointer to a mesh partitioner that is used to partition the mesh to the ranks.
+    MeshPartitioner *partitioner;
 
     /// Weights for the elements, i.e., the number of leaf elements within this element.
     map<int, double> elemWeights;
@@ -447,13 +446,13 @@ namespace AMDiS {
      * Stores to every macro element index the number of the rank that owns this
      * macro element.
      */
-    map<int, int> partitionVec;
+    map<int, int> partitionMap;
 
     /** \brief
      * Stores an old partitioning of elements. To every macro element index the
      * number of the rank it corresponds to is stored.
      */
-    map<int, int> oldPartitionVec;    
+    map<int, int> oldPartitionMap; 
    
     /// Number of DOFs in the rank mesh.
     int nRankDofs;
diff --git a/AMDiS/src/parallel/MeshPartitioner.cc b/AMDiS/src/parallel/MeshPartitioner.cc
new file mode 100644
index 00000000..77115afa
--- /dev/null
+++ b/AMDiS/src/parallel/MeshPartitioner.cc
@@ -0,0 +1,62 @@
+//
+// Software License for AMDiS
+//
+// Copyright (c) 2010 Dresden University of Technology 
+// All rights reserved.
+// Authors: Simon Vey, Thomas Witkowski et al.
+//
+// This file is part of AMDiS
+//
+// See also license.opensource.txt in the distribution.
+
+
+#include "parallel/MeshPartitioner.h"
+#include "Mesh.h"
+#include "Traverse.h"
+#include "Serializer.h"
+
+namespace AMDiS {
+
+  void MeshPartitioner::createInitialPartitioning() 
+  {
+    FUNCNAME("MeshPartitioner::createInitialPartitioning()");
+
+    int mpiRank = mpiComm->Get_rank();
+    int mpiSize = mpiComm->Get_size();
+    int nLeaves = mesh->getNumberOfLeaves();
+    int elPerRank = nLeaves / mpiSize;
+
+    // === Create initial partitioning of the AMDiS mesh. ===
+
+    elementInRank.clear();
+
+    TraverseStack stack;
+    ElInfo *elInfo = stack.traverseFirst(mesh, 0, Mesh::CALL_EL_LEVEL);
+    while (elInfo) {
+      Element *element = elInfo->getElement();
+
+      if ((element->getIndex() >= mpiRank * elPerRank &&
+	   element->getIndex() < (mpiRank + 1) * elPerRank) ||
+	  (element->getIndex() >= mpiSize * elPerRank &&
+	   mpiRank == mpiSize - 1))
+	elementInRank[element->getIndex()] = true;
+      else
+	elementInRank[element->getIndex()] = false;
+      
+      elInfo = stack.traverseNext(elInfo);
+    }
+  }
+
+
+  void MeshPartitioner::serialize(std::ostream &out)
+  {
+    SerUtil::serialize(out, elementInRank);
+  }
+
+
+  void MeshPartitioner::deserialize(std::istream &in)
+  {
+    SerUtil::deserialize(in, elementInRank);
+  }
+
+}
diff --git a/AMDiS/src/parallel/MeshPartitioner.h b/AMDiS/src/parallel/MeshPartitioner.h
new file mode 100644
index 00000000..a288062c
--- /dev/null
+++ b/AMDiS/src/parallel/MeshPartitioner.h
@@ -0,0 +1,109 @@
+// ============================================================================
+// ==                                                                        ==
+// == AMDiS - Adaptive multidimensional simulations                          ==
+// ==                                                                        ==
+// ==  http://www.amdis-fem.org                                              ==
+// ==                                                                        ==
+// ============================================================================
+//
+// Software License for AMDiS
+//
+// Copyright (c) 2010 Dresden University of Technology 
+// All rights reserved.
+// Authors: Simon Vey, Thomas Witkowski et al.
+//
+// This file is part of AMDiS
+//
+// See also license.opensource.txt in the distribution.
+
+
+
+/** \file MeshPartitioner.h */
+
+#ifndef AMDIS_MESH_PARTITIONER_H
+#define AMDIS_MESH_PARTITIONER_H
+
+#include <map>
+#include "AMDiS_fwd.h"
+#include "Mesh.h"
+
+namespace AMDiS {
+
+
+  using namespace std;
+
+
+  enum PartitionMode {
+    INITIAL = 0,          // initial partitioning of a unpartitioned mesh 
+    ADAPTIVE_REPART = 1,  // repartitioning of a adaptively refined mesh
+    REFINE_PART = 2       // quality improvement of the current partitioning
+  };
+
+
+
+  class MeshPartitioner
+  {
+  public:
+    MeshPartitioner(MPI::Intracomm *comm)
+      : mpiComm(comm),
+	mesh(NULL),
+	mapLocalGlobal(NULL)
+    {}
+
+    virtual ~MeshPartitioner() {}
+
+    /// Creates an initial paritioning of the AMDiS mesh.
+    void createInitialPartitioning();
+
+    virtual bool partition(map<int, double> &elemWeights,
+			   PartitionMode mode = INITIAL) = 0;
+
+    /// Creates a map which stores for each element the rank that owns this element.
+    virtual void getPartitionMap(map<int, int> &partitionMap) = 0;
+
+    /// Write partitioner state to disk.
+    void serialize(ostream &out);
+
+    /// Read partitioner state from disk.
+    void deserialize(istream &in);
+
+    void setMesh(Mesh *m)
+    {
+      mesh = m;
+    }
+
+    void useLocalGlobalDofMap(map<DegreeOfFreedom, DegreeOfFreedom> *m)
+    {
+      mapLocalGlobal = m;
+    }
+
+    map<int, bool>& getElementInRank()
+    {
+      return elementInRank;
+    }
+
+    map<int, vector<int> >& getRecvElements()
+    {
+      return recvElements;
+    }
+
+    map<int, vector<int> >& getSendElements()
+    {
+      return sendElements;
+    }
+
+  protected:
+    MPI::Intracomm *mpiComm;
+
+    Mesh *mesh;
+
+    map<DegreeOfFreedom, DegreeOfFreedom> *mapLocalGlobal;
+
+    /// Maps to each macro element index if it is in rank's partition or not.
+    map<int, bool> elementInRank;
+
+    map<int, vector<int> > recvElements, sendElements;
+  };
+}
+
+#endif
diff --git a/AMDiS/src/parallel/ParMetisPartitioner.cc b/AMDiS/src/parallel/ParMetisPartitioner.cc
index f8d4dfd3..c59a85fe 100644
--- a/AMDiS/src/parallel/ParMetisPartitioner.cc
+++ b/AMDiS/src/parallel/ParMetisPartitioner.cc
@@ -222,40 +222,8 @@ namespace AMDiS {
   }
 
 
-  void ParMetisPartitioner::createInitialPartitioning() 
-  {
-    FUNCNAME("ParMetrisPartitioner::createInitialPartitioning()");
-
-    int mpiRank = mpiComm->Get_rank();
-    int mpiSize = mpiComm->Get_size();
-    int nLeaves = mesh->getNumberOfLeaves();
-    int elPerRank = nLeaves / mpiSize;
-
-    // === Create initial partitioning of the AMDiS mesh. ===
-
-    elementInRank.clear();
-
-    TraverseStack stack;
-    ElInfo *elInfo = stack.traverseFirst(mesh, 0, Mesh::CALL_EL_LEVEL);
-    while (elInfo) {
-      Element *element = elInfo->getElement();
-
-      if ((element->getIndex() >= mpiRank * elPerRank &&
-	   element->getIndex() < (mpiRank + 1) * elPerRank) ||
-	  (element->getIndex() >= mpiSize * elPerRank &&
-	   mpiRank == mpiSize - 1))
-	elementInRank[element->getIndex()] = true;
-      else
-	elementInRank[element->getIndex()] = false;
-      
-      elInfo = stack.traverseNext(elInfo);
-    }
-  }
-
-
   bool ParMetisPartitioner::partition(std::map<int, double> &elemWeights,
-				      PartitionMode mode,
-				      float itr) 
+				      PartitionMode mode) 
   {
     FUNCNAME("ParMetisPartitioner::partition()");
 
@@ -403,8 +371,6 @@ namespace AMDiS {
       break;
     case ADAPTIVE_REPART:
       {
-	//	parMetisGraph.print();
-
 	std::vector<int> vsize(nElements);
 	for (int i = 0; i < nElements; i++)
 	  vsize[i] = static_cast<int>(floatWgts[i]);
@@ -453,72 +419,15 @@ namespace AMDiS {
 
     // === Distribute new partition data. ===
 
-    bool b = distributePartitioning(&(part[0]));
-
-    if (!b) {
-      MSG("RETRY ParMETIS!\n");
-
-      std::vector<float> testub(14);
-      
-      testub[0] = 1.001;
-      testub[1] = 1.01;
-      testub[2] = 1.02;
-      testub[3] = 1.03;
-      testub[4] = 1.04;
-      testub[5] = 1.06;
-      testub[6] = 1.07;
-      testub[7] = 1.08;
-      testub[8] = 1.09;
-      testub[9] = 1.1;
-      testub[10] = 1.25;
-      testub[11] = 1.5;
-      testub[12] = 2.0;
-      testub[13] = 2.5;
-
-      for (int jj = 0; jj < testub.size(); jj++) {
-      ubvec = testub[jj];
-
-      std::vector<int> vsize(nElements);
-      for (int i = 0; i < nElements; i++)
-	vsize[i] = static_cast<int>(floatWgts[i]);
-
-
-      ParMETIS_V3_AdaptiveRepart(parMetisMesh->getElementDist(),
-				 parMetisGraph.getXAdj(),
-				 parMetisGraph.getAdjncy(),
-				 &(wgts[0]),
-				 NULL,
-				 &(vsize[0]),
-				 &wgtflag,
-				 &numflag,
-				 &ncon,
-				 &nparts,
-				 &(tpwgts[0]),
-				 &ubvec,
-				 &itr,
-				 options,
-				 &edgecut,
-				 &(part[0]),
-				 &tmpComm);
-
-
-      b = distributePartitioning(&(part[0]));
-
-      MSG("ParMETIS RETRY with %f: %d\n", ubvec, b);
-      }
-    }
-
-    return b;
+    return distributePartitioning(&(part[0]));
   }
 
 
-  void ParMetisPartitioner::fillCoarsePartitionVec(std::map<int, int> *partitionVec)
+  void ParMetisPartitioner::getPartitionMap(std::map<int, int> &partitionMap)
   {
-    FUNCNAME("ParMetisPartitioner::fillCoarsePartitionVec()");
-
-    TEST_EXIT_DBG(partitionVec)("No partition vector!\n");
+    FUNCNAME("ParMetisPartitioner::getPartitionMap()");
 
-    partitionVec->clear();
+    partitionMap.clear();
 
     // update ParMETIS mesh to new partitioning
     if (!parMetisMesh)
@@ -551,7 +460,7 @@ namespace AMDiS {
     // fill partitionVec
     for (int i = 0; i < mpiSize; i++)
       for (int j = 0; j < nPartitionElements[i]; j++)
-	(*partitionVec)[partitionElements[elmdist[i] + j]] = i;
+	partitionMap[partitionElements[elmdist[i] + j]] = i;
   }
 
 
@@ -660,16 +569,5 @@ namespace AMDiS {
 
     return true;
   }
-
-  
-  void ParMetisPartitioner::serialize(std::ostream &out)
-  {
-    SerUtil::serialize(out, elementInRank);
-  }
-
-
-  void ParMetisPartitioner::deserialize(std::istream &in)
-  {
-    SerUtil::deserialize(in, elementInRank);
-  }
+ 
 }
diff --git a/AMDiS/src/parallel/ParMetisPartitioner.h b/AMDiS/src/parallel/ParMetisPartitioner.h
index a96974fd..3b11c09a 100644
--- a/AMDiS/src/parallel/ParMetisPartitioner.h
+++ b/AMDiS/src/parallel/ParMetisPartitioner.h
@@ -25,30 +25,24 @@
 
 #include <map>
 #include <set>
-#include "parmetis.h"
+#include "AMDiS_fwd.h"
 #include "Global.h"
+#include "parallel/MeshPartitioner.h"
+#include "parmetis.h"
 #include "mpi.h"
 
 namespace AMDiS {
 
-  class FiniteElemSpace;
-
-  enum PartitionMode {
-    INITIAL = 0,          // initial partitioning of a unpartitioned mesh 
-    ADAPTIVE_REPART = 1,  // repartitioning of a adaptively refined mesh
-    REFINE_PART = 2       // quality improvement of the current partitioning
-  };
+  using namespace std;
 
   class ParMetisGraph;
-  class Mesh;
-  template<typename T > class DOFVector;
 
   class ParMetisMesh
   {
   public:
     ParMetisMesh(Mesh *mesh, MPI::Intracomm *comm, 
-		 std::map<int, bool>& elementInRank,
-		 std::map<DegreeOfFreedom, DegreeOfFreedom> *mapLocalGlobal);
+		 map<int, bool>& elementInRank,
+		 map<DegreeOfFreedom, DegreeOfFreedom> *mapLocalGlobal);
 
     ~ParMetisMesh();
 
@@ -130,7 +124,7 @@ namespace AMDiS {
 
     int nElements;
 
-    std::map<int, int> elem_a2p;
+    map<int, int> elem_a2p;
 
     int *elem_p2a;
 
@@ -169,80 +163,37 @@ namespace AMDiS {
   };
 
 
-  class ParMetisPartitioner
+  class ParMetisPartitioner : public MeshPartitioner
   {
   public:
     ParMetisPartitioner(MPI::Intracomm *comm)
-      : mpiComm(comm),
-	mesh(NULL),
+      : MeshPartitioner(comm),
         parMetisMesh(NULL),
-        mapLocalGlobal(NULL)
+	itr(1000.0)
     {}
 
     ~ParMetisPartitioner();
 
-    void setMesh(Mesh *m)
-    {
-      mesh = m;
-    }
+    bool partition(map<int, double> &elemWeights,
+		   PartitionMode mode = INITIAL);
 
-    bool partition(std::map<int, double> &elemWeights,
-		   PartitionMode mode = INITIAL,
-		   float itr = 1000000.0);
+    /// Creates a map which stores for each element the rank that owns this element.
+    void getPartitionMap(map<int, int> &partitionMap);
 
-    /* \brief 
-     * Creates a map which stores for each element on partitioning level the 
-     * rank the element corresponds to.
-     */
-    void fillCoarsePartitionVec(std::map<int, int> *partitionVec);
-
-    /// Creates an initial paritioning of the AMDiS mesh.
-    void createInitialPartitioning();
-
-    void useLocalGlobalDofMap(std::map<DegreeOfFreedom, DegreeOfFreedom> *m)
-    {
-      mapLocalGlobal = m;
-    }
-
-    std::map<int, bool>& getElementInRank()
+    void setItr(float value)
     {
-      return elementInRank;
+      itr = value;
     }
 
-    std::map<int, std::vector<int> >& getRecvElements()
-    {
-      return recvElements;
-    }
-
-    std::map<int, std::vector<int> >& getSendElements()
-    {
-      return sendElements;
-    }
-
-    /// Write partitioner state to disk.
-    void serialize(std::ostream &out);
-
-    /// Read partitioner state from disk.
-    void deserialize(std::istream &in);
-
   protected:
     // Returns true, if the mesh partitioning could be distributed. If this is not the
     // case, i.e., because there are empty partitions, the function returns false.
     bool distributePartitioning(int *part);
 
   protected:
-    MPI::Intracomm *mpiComm;
-
-    Mesh *mesh;
-
     ParMetisMesh *parMetisMesh;
 
-    std::map<DegreeOfFreedom, DegreeOfFreedom> *mapLocalGlobal;
-
-    /// Maps to each macro element index if it is in rank's partition or not.
-    std::map<int, bool> elementInRank;
-
-    std::map<int, std::vector<int> > recvElements, sendElements;
+    float itr;
   };
 }
 
diff --git a/AMDiS/src/parallel/ParallelDebug.cc b/AMDiS/src/parallel/ParallelDebug.cc
index 6e130c7f..c93e0074 100644
--- a/AMDiS/src/parallel/ParallelDebug.cc
+++ b/AMDiS/src/parallel/ParallelDebug.cc
@@ -819,7 +819,7 @@ namespace AMDiS {
     
     while (elInfo) {		  
       int index = elInfo->getElement()->getIndex();
-      vec[index] = pdb.partitionVec[index];
+      vec[index] = pdb.partitionMap[index];
       elInfo = stack.traverseNext(elInfo);
     }
 
-- 
GitLab