From b2a88ee29e4fddff99c0d047fb278b270161818a Mon Sep 17 00:00:00 2001
From: Thomas Witkowski <thomas.witkowski@gmx.de>
Date: Fri, 3 Jul 2009 08:46:24 +0000
Subject: [PATCH] n

---
 AMDiS/libtool                      |  70 ++++++-------
 AMDiS/src/ParallelDomainProblem.cc | 155 +++++++++++++++++------------
 AMDiS/src/ParallelDomainProblem.h  |  18 ++--
 3 files changed, 134 insertions(+), 109 deletions(-)

diff --git a/AMDiS/libtool b/AMDiS/libtool
index 3b667337..aeddb890 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 p2d072:
 
 # 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,25 +82,25 @@ 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
 
-gcc_dir=`gcc -print-file-name=. | /bin/sed 's,/\.$,,'`
+gcc_dir=`gcc -print-file-name=. | /usr/bin/sed 's,/\.$,,'`
 gcc_ver=`gcc -dumpversion`
 
 # 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"
@@ -174,7 +174,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"
@@ -328,10 +328,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=`echo " /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/" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"`
+sys_lib_search_path_spec=`echo "/lib64 /usr/lib64 /usr/local/lib64" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"`
 
 # Run-time system search path for libraries
-sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/octave-2.9.9 /usr/lib/qt-3.3/lib "
+sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /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=""
@@ -6763,7 +6763,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 p2d072:
 
 # Shell to use when invoking shell scripts.
 SHELL="/bin/sh"
@@ -6785,12 +6785,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.
@@ -6801,25 +6801,25 @@ 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/mpiCC"
 
 # Is the compiler the GNU C compiler?
 with_gcc=yes
 
-gcc_dir=`gcc -print-file-name=. | /bin/sed 's,/\.$,,'`
+gcc_dir=`gcc -print-file-name=. | /usr/bin/sed 's,/\.$,,'`
 gcc_ver=`gcc -dumpversion`
 
 # 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"
@@ -6893,7 +6893,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"
@@ -6948,11 +6948,11 @@ striplib="strip --strip-unneeded"
 
 # Dependencies to place before the objects being linked to create a
 # shared library.
-predep_objects=`echo "/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crti.o /usr/lib/gcc/i386-redhat-linux/4.1.2/crtbeginS.o" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"`
+predep_objects=`echo "/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" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"`
 
 # Dependencies to place after the objects being linked to create a
 # shared library.
-postdep_objects=`echo "/usr/lib/gcc/i386-redhat-linux/4.1.2/crtendS.o /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crtn.o" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"`
+postdep_objects=`echo "/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" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"`
 
 # Dependencies to place before the objects being linked to create a
 # shared library.
@@ -6960,11 +6960,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=`echo "-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/../../.." | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"`
+compiler_lib_search_path=`echo "-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/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/../../.." | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"`
 
 # Method to check whether dependent libraries are shared objects.
 deplibs_check_method="pass_all"
@@ -7044,10 +7044,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=`echo " /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/" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"`
+sys_lib_search_path_spec=`echo "/lib64 /usr/lib64 /usr/local/lib64" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"`
 
 # Run-time system search path for libraries
-sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/octave-2.9.9 /usr/lib/qt-3.3/lib "
+sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /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=""
@@ -7071,7 +7071,7 @@ include_expsyms=""
 
 # ### BEGIN LIBTOOL TAG CONFIG: F77
 
-# Libtool was configured on host NWRW15:
+# Libtool was configured on host p2d072:
 
 # Shell to use when invoking shell scripts.
 SHELL="/bin/sh"
@@ -7093,12 +7093,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.
@@ -7109,7 +7109,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"
@@ -7118,16 +7118,16 @@ LTCFLAGS="-g -O2"
 CC="g77"
 
 # Is the compiler the GNU C compiler?
-with_gcc=yes
+with_gcc=
 
-gcc_dir=`gcc -print-file-name=. | /bin/sed 's,/\.$,,'`
+gcc_dir=`gcc -print-file-name=. | /usr/bin/sed 's,/\.$,,'`
 gcc_ver=`gcc -dumpversion`
 
 # 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"
@@ -7355,10 +7355,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=`echo " /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/" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"`
+sys_lib_search_path_spec=`echo "/lib64 /usr/lib64 /usr/local/lib64" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"`
 
 # Run-time system search path for libraries
-sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/octave-2.9.9 /usr/lib/qt-3.3/lib "
+sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /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/ParallelDomainProblem.cc b/AMDiS/src/ParallelDomainProblem.cc
index 2cd1e0dd..5acdb25f 100644
--- a/AMDiS/src/ParallelDomainProblem.cc
+++ b/AMDiS/src/ParallelDomainProblem.cc
@@ -36,7 +36,8 @@ namespace AMDiS {
       mesh(fe->getMesh()),
       refinementManager(refineManager),
       initialPartitionMesh(true),
-      nRankDOFs(0)
+      nRankDOFs(0),
+      rstart(0)
   {
     FUNCNAME("ParallelDomainBase::ParalleDomainBase()");
 
@@ -84,22 +85,19 @@ namespace AMDiS {
 
     createLocalGlobalNumbering(rankDOFs, boundaryDOFs, nRankDOFs, nOverallDOFs);
 
-
     // === Create interior boundary information ===
 
     createInteriorBoundaryInfo(rankDOFs, boundaryDOFs);
 
+    // === Remove all macro elements that are not part of the rank partition. ===
+
+    removeMacroElements();
+
 #if (DEBUG != 0)
     DbgTestElementMap(elMap);
     DbgTestInteriorBoundary();
 #endif
 
-    exit(0);
-
-    // === Remove all macro elements that are not part of the rank partition. ===
-
-    removeMacroElements();
-
     // === Reset all DOFAdmins of the mesh. ===
 
     int nAdmins = mesh->getNumberOfDOFAdmin();
@@ -132,8 +130,6 @@ namespace AMDiS {
     DbgTestCommonDofs();
 #endif
 
-    exit(0);
-
     // === Create petsc matrix. ===
 
     int ierr;
@@ -238,11 +234,14 @@ namespace AMDiS {
 
     DOFVector<double>::Iterator dofIt(vec, USED_DOFS);
     int counter = 0;
-    for (dofIt.reset(); !dofIt.end(); ++dofIt)
-      *dofIt = vecPointer[counter++];
+    for (dofIt.reset(); !dofIt.end(); ++dofIt) {
+      *dofIt = vecPointer[mapGlobalLocalDOFs[rstart + counter]];
+      counter++;
+    }
 
     VecRestoreArray(petscSolVec, &vecPointer);
 
+#if 0
     std::vector<double*> sendBuffers(sendDofs.size());
     std::vector<double*> recvBuffers(recvDofs.size());
 
@@ -291,6 +290,7 @@ namespace AMDiS {
     
     for (int i = 0; i < static_cast<int>(sendBuffers.size()); i++)
       delete [] sendBuffers[i];
+#endif
   }
 
 
@@ -517,20 +517,50 @@ namespace AMDiS {
 
     // Stores to each DOF pointer the set of ranks the DOF is part of.
     std::map<const DegreeOfFreedom*, std::set<int> > partitionDOFs;
+    DofContainer rankAllDofs;
 
-    createDOFMemberInfo(partitionDOFs, rankDOFs, boundaryDOFs);
+    createDOFMemberInfo(partitionDOFs, rankDOFs, rankAllDofs, boundaryDOFs);
 
     nRankDOFs = rankDOFs.size();
     nOverallDOFs = partitionDOFs.size();
 
-
     // === Get starting position for global rank dof ordering. ====
 
-    int rstart = 0;
+    //    int rstart = 0;
     mpiComm.Scan(&nRankDOFs, &rstart, 1, MPI_INT, MPI_SUM);
     rstart -= nRankDOFs;
 
-   
+
+    typedef std::map<const DegreeOfFreedom*, DegreeOfFreedom> DofIndexMap;
+    DofIndexMap rankDofsNewLocalIndex, rankDofsNewGlobalIndex;
+    int i = 0;
+    for (DofContainer::iterator dofIt = rankAllDofs.begin();
+	 dofIt != rankAllDofs.end(); ++dofIt) {
+      rankDofsNewLocalIndex[*dofIt] = i++;
+      isRankDof[i] = true;
+    }
+
+    i = 0;
+    for (DofContainer::iterator dofIt = rankDOFs.begin();
+	 dofIt != rankDOFs.end(); ++dofIt) {
+      rankDofsNewGlobalIndex[*dofIt] = i + rstart;
+      i++;
+    }
+
+    if (mpiRank == 0) {
+      for (DofContainer::iterator dofIt = rankAllDofs.begin();
+	   dofIt != rankAllDofs.end(); ++dofIt) {
+	std::cout << "OLD DOF = " << **dofIt << "   NEW L DOF = " << rankDofsNewLocalIndex[*dofIt];
+	if (rankDofsNewGlobalIndex.find(*dofIt) != rankDofsNewGlobalIndex.end())
+	  std::cout << "    NEW G DOF = " << rankDofsNewGlobalIndex[*dofIt];
+	std::cout << std::endl;
+      }
+    }
+
+    exit(0);
+
+
+  
     // === Create information which dof indices must be send and which must  ===
     // === be received.                                                      ===
 
@@ -549,21 +579,16 @@ namespace AMDiS {
       if (it->second == mpiRank) {
 	// If the boundary dof is a rank dof, it must be send to other ranks.
 
-	// search for new dof index in ranks partition for this boundary dof
-	DegreeOfFreedom newDofIndex = 0;
-	for (int i = 0; i < nRankDOFs; i++) {
-	  if (rankDOFs[i] == it->first) {
-	    newDofIndex = rstart + i;
-	    break;
-	  }
-	}
-
 	// Search for all ranks that have this dof too.
 	for (std::set<int>::iterator itRanks = partitionDOFs[it->first].begin();
 	     itRanks != partitionDOFs[it->first].end();
 	     ++itRanks) {
-	  if (*itRanks != mpiRank)
-	    sendNewDofs[*itRanks][it->first] = newDofIndex;
+	  if (*itRanks != mpiRank) {
+	    TEST_EXIT_DBG(rankDofsNewGlobalIndex.count(it->first) == 1)
+	      ("DOF Key not found!\n");
+
+	    sendNewDofs[*itRanks][it->first] = rankDofsNewGlobalIndex[it->first];
+	  }
 	}
       } else {
 	// If the boundary dof is not a rank dof, its new dof index, and later
@@ -575,6 +600,7 @@ namespace AMDiS {
       }
     }
 
+
     // === Send and receive the dof indices at boundary. ===
 
     std::vector<int*> sendBuffers(sendNewDofs.size()), recvBuffers(recvNewDofs.size());
@@ -585,7 +611,7 @@ namespace AMDiS {
     MPI::Request request[sendNewDofs.size() + recvNewDofs.size()];
     int requestCounter = 0;
 
-    int i = 0;
+    i = 0;
     for (std::map<int, std::map<const DegreeOfFreedom*, DegreeOfFreedom> >::iterator 
 	   sendIt = sendNewDofs.begin();
 	 sendIt != sendNewDofs.end();
@@ -637,15 +663,8 @@ namespace AMDiS {
 
     mapLocalGlobalDOFs.clear();
     mapGlobalLocalDOFs.clear();
-    isRankDOF.clear();
+    isRankDof.clear();
 
-    for (int i = 0; i < nRankDOFs; i++) {
-      *const_cast<DegreeOfFreedom*>(rankDOFs[i]) = i; 
-      mapLocalGlobalDOFs[i] = rstart + i;
-      mapGlobalLocalDOFs[rstart + i] = i;
-      isRankDOF[i] = true;
-    }
-#if 0
     // === Change dof indices at boundary from other ranks. ===
 
     // Within this small data structure we track which dof index was already changed.
@@ -669,7 +688,6 @@ namespace AMDiS {
 
 	DegreeOfFreedom oldDof = recvBuffers[i][j * 2];
 	DegreeOfFreedom newGlobalDof = recvBuffers[i][j * 2 + 1];
-	DegreeOfFreedom newLocalDof = mapLocalGlobalDOFs.size();
 
 	bool found = false;
 
@@ -682,11 +700,9 @@ namespace AMDiS {
 	    dofChanged[dofIt->first] = true;
 
 	    recvDofs[recvIt->first].push_back(dofIt->first);
-	    *(const_cast<DegreeOfFreedom*>(dofIt->first)) = newLocalDof;
+	    rankDofsNewGlobalIndex[dofIt->first] = newGlobalDof;
+	    isRankDof[rankDofsNewLocalIndex[dofIt->first]] = false;
 
-	    mapLocalGlobalDOFs[newLocalDof] = newGlobalDof;
-	    mapGlobalLocalDOFs[newGlobalDof] = newLocalDof;
-	    isRankDOF[newLocalDof] = false;
 	    found = true;
 	    break;
 	  }
@@ -697,7 +713,16 @@ namespace AMDiS {
 
       delete [] recvBuffers[i];
     }
-#endif
+
+    for (DofIndexMap::iterator dofIt = rankDofsNewLocalIndex.begin();
+	 dofIt != rankDofsNewLocalIndex.end(); ++dofIt) {
+      DegreeOfFreedom localDof = dofIt->second;
+      DegreeOfFreedom globalDof = rankDofsNewGlobalIndex[dofIt->first];
+
+      *const_cast<DegreeOfFreedom*>(dofIt->first) = localDof;
+      mapLocalGlobalDOFs[localDof] = globalDof;
+      mapGlobalLocalDOFs[globalDof] = localDof;
+    }
   }
 
 
@@ -867,7 +892,7 @@ namespace AMDiS {
 
     mapLocalGlobalDOFs.clear();
     mapGlobalLocalDOFs.clear();
-    isRankDOF.clear();
+    isRankDof.clear();
 
     int i = 0;
     for (std::set<const DegreeOfFreedom*>::iterator dofIt = rankDOFs.begin();
@@ -875,7 +900,7 @@ namespace AMDiS {
       *(const_cast<DegreeOfFreedom*>(*dofIt)) = i;
       mapLocalGlobalDOFs[i] = rstart + i;
       mapGlobalLocalDOFs[rstart + i] = i;
-      isRankDOF[i] = true;
+      isRankDof[i] = true;
     }
 
     // === Send new DOF indices. ===
@@ -927,7 +952,7 @@ namespace AMDiS {
 	(*const_cast<DegreeOfFreedom*>(*dofIt)) = newDofIndex;
 	mapLocalGlobalDOFs[newDofIndex] = recvBuffers[i][j];
 	mapGlobalLocalDOFs[recvBuffers[i][j]] = newDofIndex;
-	isRankDOF[newDofIndex] = false;
+	isRankDof[newDofIndex] = false;
 	newDofIndex++;
 	j++;
       }
@@ -1026,10 +1051,16 @@ namespace AMDiS {
   }
 
 
-  void ParallelDomainBase::createDOFMemberInfo(DofToPartitions& partitionDOFs,
-					       DofContainer& rankDOFs,
-					       DofToRank& boundaryDOFs)
+  void ParallelDomainBase::createDOFMemberInfo(DofToPartitions& partitionDofs,
+					       DofContainer& rankOwnedDofs,
+					       DofContainer& rankAllDofs,
+					       DofToRank& boundaryDofs)
   {
+    partitionDofs.clear();
+    rankOwnedDofs.clear();
+    rankAllDofs.clear();
+    boundaryDofs.clear();
+
     // === Determine to each dof the set of partitions the dof belongs to. ===
 
     ElementDofIterator elDofIt(feSpace);
@@ -1041,7 +1072,7 @@ namespace AMDiS {
       elDofIt.reset(element);
       do {
 	// Determine to each dof the partition(s) it corresponds to.
-	partitionDOFs[elDofIt.getDofPtr()].insert(partitionVec[element->getIndex()]);
+	partitionDofs[elDofIt.getDofPtr()].insert(partitionVec[element->getIndex()]);
       } while(elDofIt.next());
 
       elInfo = stack.traverseNext(elInfo);
@@ -1051,18 +1082,18 @@ namespace AMDiS {
     // === Determine the set of ranks dofs and the dofs ownership at the boundary. ===
 
     // iterate over all DOFs
-    for (DofToPartitions::iterator it = partitionDOFs.begin();
-	 it != partitionDOFs.end();
-	 ++it) {
+    for (DofToPartitions::iterator it = partitionDofs.begin();
+	 it != partitionDofs.end(); ++it) {
 
       // iterate over all partition the current DOF is part of.
       for (std::set<int>::iterator itpart1 = it->second.begin();
-	   itpart1 != it->second.end();
-	   ++itpart1) {
+	   itpart1 != it->second.end(); ++itpart1) {
 
 	if (*itpart1 == mpiRank) {
+	  rankAllDofs.push_back(it->first);
+
 	  if (it->second.size() == 1) {
-	    rankDOFs.push_back(it->first);
+	    rankOwnedDofs.push_back(it->first);
 	  } else {	    
 	    // This dof is at the ranks boundary. It is owned by the rank only if
 	    // the rank number is the highest of all ranks containing this dof.
@@ -1070,8 +1101,7 @@ namespace AMDiS {
 	    bool insert = true;
 	    int highestRank = mpiRank;
 	    for (std::set<int>::iterator itpart2 = it->second.begin();
-		 itpart2 != it->second.end();
-		 ++itpart2) {
+		 itpart2 != it->second.end(); ++itpart2) {
 	      if (*itpart2 > mpiRank)
 		insert = false;
 
@@ -1080,9 +1110,9 @@ namespace AMDiS {
 	    }
 
 	    if (insert)
-	      rankDOFs.push_back(it->first);
+	      rankOwnedDofs.push_back(it->first);
 
-	    boundaryDOFs[it->first] = highestRank;
+	    boundaryDofs[it->first] = highestRank;
 	  }
 
 	  break;
@@ -1091,7 +1121,8 @@ namespace AMDiS {
       }
     }
 
-    sort(rankDOFs.begin(), rankDOFs.end(), cmpDofsByValue);
+    sort(rankAllDofs.begin(), rankAllDofs.end(), cmpDofsByValue);
+    sort(rankOwnedDofs.begin(), rankOwnedDofs.end(), cmpDofsByValue);
   }
 
 
@@ -1107,7 +1138,6 @@ namespace AMDiS {
     ElInfo *elInfo = stack.traverseFirst(mesh, -1, Mesh::CALL_LEAF_EL);
     while (elInfo) {
       Element *el = elInfo->getElement();
-      if (mpiRank == 0) std::cout << "EL = " << el->getIndex() << std::endl;
       orderDOFs(el->getDOF(0), el->getDOF(1), el->getDOF(2), elMap[el->getIndex()]);
       elInfo = stack.traverseNext(elInfo);
     }
@@ -1124,7 +1154,6 @@ namespace AMDiS {
     ElInfo *elInfo = stack.traverseFirst(mesh, -1, Mesh::CALL_LEAF_EL);
     while (elInfo) {
       Element *el = elInfo->getElement();
-      if (mpiRank == 0) std::cout << "EL = " << el->getIndex() << std::endl;
       orderDOFs(el->getDOF(0), el->getDOF(1), el->getDOF(2), vec);
       for (int i = 0; i < 3; i++) {
 	if (elMap[el->getIndex()][i] != vec[i]) {
@@ -1359,7 +1388,7 @@ namespace AMDiS {
 
     TEST_EXIT(m)("No DOF Matrix!\n");
 
-    m->setIsRankDOF(isRankDOF);
+    m->setIsRankDOF(isRankDof);
   }
 
   void ParallelDomainScal::solve()
diff --git a/AMDiS/src/ParallelDomainProblem.h b/AMDiS/src/ParallelDomainProblem.h
index ef478fd0..152865ee 100644
--- a/AMDiS/src/ParallelDomainProblem.h
+++ b/AMDiS/src/ParallelDomainProblem.h
@@ -200,9 +200,10 @@ namespace AMDiS {
      * \param[out] boundaryDOFs  Stores all DOFs in ranks partition that are on an 
      *                           interior boundary but correspond to another rank.
      */
-    void createDOFMemberInfo(DofToPartitions& partitionDOFs,
-			     DofContainer& rankDOFs,
-			     DofToRank& boundaryDOFs);
+    void createDOFMemberInfo(DofToPartitions& partitionDofs,
+			     DofContainer& rankOwnedDofs,
+			     DofContainer& rankAllDofs,
+			     DofToRank& boundaryDofs);
 
     void DbgCreateElementMap(ElementIdxToDofs &elMap);
     
@@ -225,13 +226,6 @@ namespace AMDiS {
     {
       vec.resize(3);
 
-      if (mpiRank == 0)
-	std::cout << "DOFS are: " 
-		  << dof1 << " = " << *dof1 << "   "
-		  << dof2 << " = " << *dof2 << "   "
-		  << dof3 << " = " << *dof3 << "   "
-		  << std::endl;
-      
       if (*dof1 < *dof2 && *dof1 < *dof3)
 	vec[0] = dof1;
       else if (*dof2 < *dof1 && *dof2 < *dof3)
@@ -364,7 +358,9 @@ namespace AMDiS {
      * owned by the rank. Otherwise, its an interior boundary DOF that is owned by
      * another rank.
      */
-    DofToBool isRankDOF;
+    DofToBool isRankDof;
+
+    int rstart;
   };
 
   bool cmpDofsByValue(const DegreeOfFreedom* dof1, const DegreeOfFreedom* dof2)
-- 
GitLab