From e5b12c1a1c83139eab1f13fc045b8c1706adfac0 Mon Sep 17 00:00:00 2001
From: Thomas Witkowski <thomas.witkowski@gmx.de>
Date: Mon, 7 Dec 2009 14:11:55 +0000
Subject: [PATCH] First test with 3d parallelization.

---
 AMDiS/libtool                     |  70 ++++++++--------
 AMDiS/src/ConditionalEstimator.cc |   8 +-
 AMDiS/src/DOFAdmin.cc             |  10 ++-
 AMDiS/src/Element.h               |  26 +++---
 AMDiS/src/ElementDofIterator.cc   |   2 +-
 AMDiS/src/InteriorBoundary.h      |   3 +
 AMDiS/src/Line.h                  |   4 +-
 AMDiS/src/ParallelDomainBase.cc   | 106 +++++++++++++++---------
 AMDiS/src/RefinementManager2d.cc  |  16 ----
 AMDiS/src/Tetrahedron.cc          | 133 ++++++++++++++++++++++++++----
 AMDiS/src/Tetrahedron.h           |   4 +-
 AMDiS/src/Triangle.cc             |  29 +++----
 AMDiS/src/Triangle.h              |   6 +-
 13 files changed, 273 insertions(+), 144 deletions(-)

diff --git a/AMDiS/libtool b/AMDiS/libtool
index e96f6706..702bb183 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 deimos102:
 
 # 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 /usr/lib/qt4/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 deimos102:
 
 # 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 /usr/lib/qt4/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 deimos102:
 
 # 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 /usr/lib/qt4/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/ConditionalEstimator.cc b/AMDiS/src/ConditionalEstimator.cc
index 2a17b00e..f58d4b8a 100644
--- a/AMDiS/src/ConditionalEstimator.cc
+++ b/AMDiS/src/ConditionalEstimator.cc
@@ -9,7 +9,7 @@ namespace AMDiS {
 
   double ConditionalEstimator::estimate(double ts) 
   {
-    if(decoratedEstimator_) {
+    if (decoratedEstimator_) {
 
       double partition_sum = 0.0;
 
@@ -22,7 +22,7 @@ namespace AMDiS {
 
       TraverseStack stack;
       ElInfo *elInfo = stack.traverseFirst(mesh, -1, traverseFlag);
-      while(elInfo) {
+      while (elInfo) {
 	PartitionElementData *elData = dynamic_cast<PartitionElementData*>
 	  (elInfo->getElement()->getElementData(PARTITION_ED));
 
@@ -40,9 +40,7 @@ namespace AMDiS {
       }
 
       elInfo = stack.traverseFirst(mesh, -1, traverseFlag);
-      while(elInfo) {
-	PartitionElementData *elData = dynamic_cast<PartitionElementData*>
-	  (elInfo->getElement()->getElementData(PARTITION_ED));
+      while (elInfo) {
 	//if(status == IN) {
 	  elementCount_++;
 	  partition_sum += elInfo->getElement()->getEstimation(row_);
diff --git a/AMDiS/src/DOFAdmin.cc b/AMDiS/src/DOFAdmin.cc
index 128530f0..6d06c7d8 100755
--- a/AMDiS/src/DOFAdmin.cc
+++ b/AMDiS/src/DOFAdmin.cc
@@ -306,16 +306,20 @@ namespace AMDiS {
       (*dc)->compressDOFContainer(n, new_dof);
   }
 
-  void DOFAdmin::setNumberOfDOFs(int i,int v) 
+  void DOFAdmin::setNumberOfDOFs(int i, int v) 
   { 
-    TEST_EXIT_DBG((0 <= i) && (4 > i))("");
+    FUNCNAME("DOFAdmin::setNumberOfDOFs()");
+
+    TEST_EXIT_DBG(0 <= i && 4 > i)("Should not happen!\n");
 
     nrDOF[i] = v; 
   }
 
   void DOFAdmin::setNumberOfPreDOFs(int i, int v) 
   { 
-    TEST_EXIT_DBG((0 <= i) && (4 > i))(""); 
+    FUNCNAME("DOFAdmin::setNumberOfPreDOFs()");
+
+    TEST_EXIT_DBG(0 <= i && 4 > i)("Should not happen!\n"); 
 
     nr0DOF[i] = v; 
   }
diff --git a/AMDiS/src/Element.h b/AMDiS/src/Element.h
index 70c8c97a..a831cad0 100644
--- a/AMDiS/src/Element.h
+++ b/AMDiS/src/Element.h
@@ -371,31 +371,37 @@ namespace AMDiS {
     virtual bool hasSide(Element *sideElem) const = 0;
 
     /** \brief
-     * Traverses an edge of a given element (this includes also all children of the
-     * element having the same edge). All vertex dofs alonge this edge are assembled 
-     * and put together to a list.
+     * Traverses an edge/face of a given element (this includes also all children of 
+     * the element having the same edge/face). All vertex dofs alonge this edge/face
+     * are assembled and put together to a list. 
      *
      * \param[in]  feSpace         FE space which is used to get the dofs.
-     * \param[in]  ithEdge         Defines the edge on which all the vertex dofs
+     * \param[in]  ith             Defines the edge/face on which all the vertex dofs
      *                             are assembled.
+     * \param[in]  geoPos          Must be either EDGE or FACE. Defines whether an
+     *                             edge or a face (only in 3d) should be traversed.
      * \param[out] dofs            List of dofs, where the result is stored.
      * \param[in]  parentVertices  If true, also the two vertices of the parent
      *                             element are put into the result list.
      */
-    virtual void getVertexDofs(FiniteElemSpace* feSpace, int ithEdge, 
+    virtual void getVertexDofs(FiniteElemSpace* feSpace, 
+			       int ith, int elType,
 			       DofContainer& dofs, bool parentVertices = 0) const = 0;
 
     /** \brief
-     * Traverses an edge of a given element (this includes also all children of the
-     * element having the same edge). All non vertex dofs alonge this edge are 
-     * assembled and put together to a list.
+     * Traverses an edge/face of a given element (this includes also all children of 
+     * the element having the same edge/face). All non vertex dofs alonge this edge/face 
+     * are assembled and put together to a list.
      *
      * \param[in]  feSpace         FE space which is used to get the dofs.
-     * \param[in]  ithEdge         Defines the edge on which all the non vertex
+     * \param[in]  ith             Defines the edge/face on which all the non vertex
      *                             dofs are assembled.
+     * \param[in]  geoPos          Must be either EDGE or FACE. Defines whether an
+     *                             edge or a face (only in 3d) should be traversed.
      * \param[out] dofs            All dofs are put to this dof list.
      */
-    virtual void getNonVertexDofs(FiniteElemSpace* feSpace, int ithEdge, 
+    virtual void getNonVertexDofs(FiniteElemSpace* feSpace, 
+				  int ith, int elType,
 				  DofContainer& dofs) const = 0;
 
 
diff --git a/AMDiS/src/ElementDofIterator.cc b/AMDiS/src/ElementDofIterator.cc
index 6fa9bba5..db470482 100644
--- a/AMDiS/src/ElementDofIterator.cc
+++ b/AMDiS/src/ElementDofIterator.cc
@@ -67,7 +67,7 @@ namespace AMDiS {
 	  // Get number of dofs in this position.
 	  nDofs = admin->getNumberOfDOFs(posIndex);
 	} while (nDofs == 0 && pos < dim);
-	
+
 	if (nDofs > 0 && pos <= dim) {
 	  // We have found on more position with dofs.
 
diff --git a/AMDiS/src/InteriorBoundary.h b/AMDiS/src/InteriorBoundary.h
index 424f23ff..cb12f255 100644
--- a/AMDiS/src/InteriorBoundary.h
+++ b/AMDiS/src/InteriorBoundary.h
@@ -39,6 +39,9 @@ namespace AMDiS {
     /// Index of the macro element.
     int elIndex;
 
+    /// Element type index, only used in 3d.
+    int elType;
+
     /** \brief
      * Defines the geometrical object at the boundary. It must be "a part" of the
      * macro element \ref el, i.e., either 1 (a vertex), 2 (an edge) or 3 (a face).
diff --git a/AMDiS/src/Line.h b/AMDiS/src/Line.h
index bc5bc675..6901c896 100644
--- a/AMDiS/src/Line.h
+++ b/AMDiS/src/Line.h
@@ -147,7 +147,7 @@ namespace AMDiS {
       return "Line"; 
     }
 
-    void getVertexDofs(FiniteElemSpace* feSpace, int ithEdge, 
+    void getVertexDofs(FiniteElemSpace* feSpace, int ithEdge, int elType, 
 		       DofContainer& dofs, bool parentVertices = 0) const
     {
       FUNCNAME("Line::getVertexDofs()");
@@ -155,7 +155,7 @@ namespace AMDiS {
       ERROR_EXIT("Not yet implemented!\n");
     }
 
-    void getNonVertexDofs(FiniteElemSpace* feSpace, int ithEdge, 
+    void getNonVertexDofs(FiniteElemSpace* feSpace, int ithEdge, int elType,
 			  DofContainer& dofs) const
     {
       FUNCNAME("Line::getNonVertexDofs()");
diff --git a/AMDiS/src/ParallelDomainBase.cc b/AMDiS/src/ParallelDomainBase.cc
index 86f6c049..e91e663d 100644
--- a/AMDiS/src/ParallelDomainBase.cc
+++ b/AMDiS/src/ParallelDomainBase.cc
@@ -128,8 +128,6 @@ namespace AMDiS {
 
     createPeriodicMap();
 
-    //    exit(0);
-
     // === Global refinements. ===
 
     int globalRefinement = 0;
@@ -155,8 +153,6 @@ namespace AMDiS {
       createPeriodicMap();
     }
 
-    //  exit(0);
-
 #if (DEBUG != 0)
     dbgTestCommonDofs(true);
 #endif
@@ -1021,12 +1017,14 @@ namespace AMDiS {
 	    AtomicBoundary bound;	    	    
 	    bound.rankObj.el = element;
 	    bound.rankObj.elIndex = element->getIndex();
+	    bound.rankObj.elType = elInfo->getType();
 	    bound.rankObj.subObj = subObj;
 	    bound.rankObj.ithObj = i;
 	    // Do not set a pointer to the element, because if will be deleted from
 	    // mesh after partitioning and the pointer would become invalid.
 	    bound.neighObj.el = NULL;
 	    bound.neighObj.elIndex = elInfo->getNeighbour(i)->getIndex();
+	    bound.neighObj.elType = -1;
 	    bound.neighObj.subObj = subObj;
 	    bound.neighObj.ithObj = elInfo->getSideOfNeighbour(i);
 	    
@@ -1413,7 +1411,6 @@ namespace AMDiS {
 			rankDofsNewGlobalIndex);
   }
 
-
   void ParallelDomainBase::updateLocalGlobalNumbering(int& nRankDofs, int& nOverallDOFs)
   {
     FUNCNAME("ParallelDomainBase::updateLocalGlobalNumbering()");
@@ -1490,24 +1487,26 @@ namespace AMDiS {
     
     for (RankToBoundMap::iterator it = myIntBoundary.boundary.begin();
 	 it != myIntBoundary.boundary.end(); ++it) {    
-      
+     
       DofContainer &dofsToSend = sendDofs[it->first];
 
       for (std::vector<AtomicBoundary>::iterator boundIt = it->second.begin();
 	   boundIt != it->second.end(); ++boundIt) {
 	DofContainer dofs;	
-	boundIt->rankObj.el->getVertexDofs(feSpace, boundIt->rankObj.ithObj, dofs);
-	boundIt->rankObj.el->getNonVertexDofs(feSpace, boundIt->rankObj.ithObj, dofs);
 
-	for (int i = 0; i < static_cast<int>(dofs.size()); i++) {
-	  TEST_EXIT_DBG(find(dofsToSend.begin(), dofsToSend.end(), dofs[i]) == dofsToSend.end())
-	    ("Should not happen!\n");
+	boundIt->rankObj.el->getVertexDofs(feSpace, 
+					   boundIt->rankObj.ithObj, 
+					   boundIt->rankObj.elType,
+					   dofs);
+  	boundIt->rankObj.el->getNonVertexDofs(feSpace, 
+  					      boundIt->rankObj.ithObj, 
+  					      boundIt->rankObj.elType,
+  					      dofs);
 
+	for (int i = 0; i < static_cast<int>(dofs.size()); i++)
 	  dofsToSend.push_back(dofs[i]);
-	}
       }
-    }
-   
+    } 
 
     for (RankToBoundMap::iterator it = otherIntBoundary.boundary.begin();
 	 it != otherIntBoundary.boundary.end(); ++it) {
@@ -1516,22 +1515,36 @@ namespace AMDiS {
 
       for (std::vector<AtomicBoundary>::iterator boundIt = it->second.begin();
 	   boundIt != it->second.end(); ++boundIt) {
-
 	DofContainer dofs;
-	boundIt->rankObj.el->getNonVertexDofs(feSpace, boundIt->rankObj.ithObj, dofs);
-	boundIt->rankObj.el->getVertexDofs(feSpace, boundIt->rankObj.ithObj, dofs);
-
-	for (int i = static_cast<int>(dofs.size()) - 1; i >= 0; i--) {
-	  TEST_EXIT_DBG(find(dofsToRecv.begin(), dofsToRecv.end(), dofs[i]) == dofsToRecv.end())
-	    ("Should not happen!\n");
 
-	  DofContainer::iterator eraseIt = find(rankDofs.begin(), rankDofs.end(), dofs[i]);
-	  if (eraseIt != rankDofs.end())
-	    rankDofs.erase(eraseIt);	  
-
-	  dofsToRecv.push_back(dofs[i]);
+  	boundIt->rankObj.el->getNonVertexDofs(feSpace, 
+  					      boundIt->rankObj.ithObj, 
+  					      boundIt->rankObj.elType,
+  					      dofs);
+	boundIt->rankObj.el->getVertexDofs(feSpace, 
+					   boundIt->rankObj.ithObj, 
+					   boundIt->rankObj.elType,
+					   dofs);
+
+	if (mesh->getDim() == 2) {
+	  for (int i = static_cast<int>(dofs.size()) - 1; i >= 0; i--) {
+	    DofContainer::iterator eraseIt = 
+	      find(rankDofs.begin(), rankDofs.end(), dofs[i]);
+	    if (eraseIt != rankDofs.end())
+	      rankDofs.erase(eraseIt);	  
+	    
+	    dofsToRecv.push_back(dofs[i]);
+	  }
+	} else {
+	  for (int i = 0; i < static_cast<int>(dofs.size()); i++) {
+	    DofContainer::iterator eraseIt = 
+	      find(rankDofs.begin(), rankDofs.end(), dofs[i]);
+	    if (eraseIt != rankDofs.end())
+	      rankDofs.erase(eraseIt);	  
+	    
+	    dofsToRecv.push_back(dofs[i]);
+	  }
 	}
-
       }
     }
 
@@ -1769,8 +1782,14 @@ namespace AMDiS {
 
       for (std::vector<AtomicBoundary>::iterator boundIt = it->second.begin();
 	   boundIt != it->second.end(); ++boundIt) {
-	boundIt->rankObj.el->getVertexDofs(feSpace, boundIt->rankObj.ithObj, dofs, true);
-	boundIt->rankObj.el->getNonVertexDofs(feSpace, boundIt->rankObj.ithObj, dofs);
+	boundIt->rankObj.el->getVertexDofs(feSpace, 
+					   boundIt->rankObj.ithObj, 
+					   boundIt->rankObj.elType,
+					   dofs, true);
+	boundIt->rankObj.el->getNonVertexDofs(feSpace, 
+					      boundIt->rankObj.ithObj, 
+					      boundIt->rankObj.elType,
+					      dofs);
       }
 
       // Send the global indices to the rank on the other side.
@@ -1813,8 +1832,14 @@ namespace AMDiS {
       for (std::vector<AtomicBoundary>::iterator boundIt = it->second.begin();
 	   boundIt != it->second.end(); ++boundIt) {
 	DofContainer tmpdofs;
-	boundIt->rankObj.el->getNonVertexDofs(feSpace, boundIt->rankObj.ithObj, tmpdofs);
-	boundIt->rankObj.el->getVertexDofs(feSpace, boundIt->rankObj.ithObj, tmpdofs, true);
+	boundIt->rankObj.el->getNonVertexDofs(feSpace, 
+					      boundIt->rankObj.ithObj, 
+					      boundIt->rankObj.elType,
+					      tmpdofs);
+	boundIt->rankObj.el->getVertexDofs(feSpace, 
+					   boundIt->rankObj.ithObj,
+					   boundIt->rankObj.elType,
+					   tmpdofs, true);
 	for (int j = static_cast<int>(tmpdofs.size()) - 1; j >= 0; j--)
 	  dofs.push_back(tmpdofs[j]);	
       }
@@ -1834,8 +1859,9 @@ namespace AMDiS {
     sendBuffers.clear();
     recvBuffers.clear();
 
-    TEST_EXIT_DBG(mesh->getDim() == 2)
-      ("Periodic boundary corner problem must be generalized to 3d!\n");
+    if (dofFromRank.size() > 0) 
+      TEST_EXIT_DBG(mesh->getDim() == 2)
+	("Periodic boundary corner problem must be generalized to 3d!\n");
 
     requestCounter = 0;
     for (std::map<DegreeOfFreedom, std::set<int> >::iterator it = dofFromRank.begin();
@@ -2274,11 +2300,17 @@ namespace AMDiS {
 	    std::cout << "[DBG]  "
 		      << "Rank " << mpiRank << " from rank " << it->first
 		      << " expect coords (";
-	    for (int k = 0; k < dimOfWorld; k++)
-	      std::cout << (it->second)[i][k] << " , ";
+	    for (int k = 0; k < dimOfWorld; k++) {
+	      std::cout << (it->second)[i][k];
+	      if (k + 1 < dimOfWorld)
+		std::cout << " / ";
+	    }
 	    std::cout << ")  received coords (";
-	    for (int k = 0; k < dimOfWorld; k++)
-	      std::cout << recvCoordsBuffer[it->first][i * dimOfWorld + k] << " , ";
+	    for (int k = 0; k < dimOfWorld; k++) {
+	      std::cout << recvCoordsBuffer[it->first][i * dimOfWorld + k];
+	      if (k + 1 < dimOfWorld)
+		std::cout << " / ";
+	    }
 	    std::cout << ")" << std::endl;
 	  }
 
diff --git a/AMDiS/src/RefinementManager2d.cc b/AMDiS/src/RefinementManager2d.cc
index 196e4527..47502a11 100644
--- a/AMDiS/src/RefinementManager2d.cc
+++ b/AMDiS/src/RefinementManager2d.cc
@@ -19,17 +19,11 @@ namespace AMDiS {
   {
     FUNCNAME("RefinementManager::refineFunction()");
 
-//     if (MPI::COMM_WORLD.Get_rank() == 0)
-//       std::cout << "IN EL = " << el_info->getElement()->getIndex() << std::endl;
-
     bool bound = false;
     DegreeOfFreedom *edge[2];
     RCNeighbourList* refineList = new RCNeighbourList(2);
 
     if (el_info->getElement()->getMark() <= 0) {
-//       if (MPI::COMM_WORLD.Get_rank() == 0)
-// 	std::cout << "RETURN!" << std::endl;
-      
       delete refineList;
 
       // Element may not be refined.
@@ -90,15 +84,8 @@ namespace AMDiS {
 	firstNewDOF = newDOF;
       
       if (lastNewDOF != -1) {
-	int i = 0;
 	for (it = mesh->getPeriodicAssociations().begin(); it != end; ++it) {
-// 	  if (MPI::COMM_WORLD.Get_rank() == 0)
-// 	    std::cout << "i = " << i++ << std::endl;
-
 	  if (it->second) {
-// 	    if (MPI::COMM_WORLD.Get_rank() == 0)
-// 	      std::cout << "*: " << newDOF << " " << lastNewDOF << std::endl;
-
 	    if (((*(it->second))[edge[0][0]] == last_edge[0][0] &&
 		 (*(it->second))[edge[1][0]] == last_edge[1][0]) || 
 		((*(it->second))[edge[0][0]] == last_edge[1][0] &&
@@ -125,9 +112,6 @@ namespace AMDiS {
 	       (*(it->second))[first_edge[1][0]] == last_edge[1][0]) || 
 	      ((*(it->second))[first_edge[0][0]] == last_edge[1][0] &&
 	       (*(it->second))[first_edge[1][0]] == last_edge[0][0])) {
-// 	    if (MPI::COMM_WORLD.Get_rank() == 0)
-// 	      std::cout << "**: " << newDOF << " " << lastNewDOF << std::endl;
-
 	    (*(it->second))[lastNewDOF] = firstNewDOF;
 	    (*(it->second))[firstNewDOF] = lastNewDOF;
 	  }
diff --git a/AMDiS/src/Tetrahedron.cc b/AMDiS/src/Tetrahedron.cc
index fc49f374..fa8151f6 100644
--- a/AMDiS/src/Tetrahedron.cc
+++ b/AMDiS/src/Tetrahedron.cc
@@ -3,6 +3,7 @@
 #include "Mesh.h"
 #include "CoarseningManager.h"
 #include "FixVec.h"
+#include "ElementDofIterator.h"
 
 namespace AMDiS {
 
@@ -69,10 +70,10 @@ namespace AMDiS {
   }
 
   int Tetrahedron::getVertexOfPosition(GeoIndex position,
-				       int      positionIndex,
-				       int      vertexIndex) const 
+				       int positionIndex,
+				       int vertexIndex) const 
   {
-    FUNCNAME("Triangle::getVertexOfPosition");
+    FUNCNAME("Triangle::getVertexOfPosition()");
     switch(position) {
     case VERTEX:
       return positionIndex;
@@ -96,14 +97,11 @@ namespace AMDiS {
   Tetrahedron::sortFaceIndices(int face, FixVec<int,WORLD> *vec) const
   {
     static MatrixOfFixVecs<FixVec<int,WORLD> > *sorted_3d = NULL;
-    int no=0;
     FixVec<int,WORLD> *val = NULL;
-    const int *vof = NULL;
+    const int *vof = vertexOfFace[face];
 
-    vof = vertexOfFace[face];
-
-    if(NULL == sorted_3d) {
-      sorted_3d = new MatrixOfFixVecs<FixVec<int,WORLD> >(3,4,7,NO_INIT);
+    if (NULL == sorted_3d) {
+      sorted_3d = new MatrixOfFixVecs<FixVec<int,WORLD> >(3, 4, 7, NO_INIT);
  
       (*sorted_3d)[0][0][0]=(*sorted_3d)[0][0][1]=
 	(*sorted_3d)[0][0][2]=(*sorted_3d)[1][0][0]=
@@ -152,6 +150,7 @@ namespace AMDiS {
 	(*sorted_3d)[2][5][0]=(*sorted_3d)[2][6][1]=3;
     }
 
+    int no = 0;
     if (dof[vof[0]][0] < dof[vof[1]][0])
       no++;
     if (dof[vof[1]][0] < dof[vof[2]][0])
@@ -159,10 +158,9 @@ namespace AMDiS {
     if (dof[vof[2]][0] < dof[vof[0]][0])
       no += 4;
 
-    if (!(no >= 1  &&  no <= 6)){
+    if (!(no >= 1  &&  no <= 6))
       ERROR_EXIT("can not sort face indices of element %d at face %d\n", 
 		 getIndex(), face);
-    }
 
     if (vec) {
       val = vec;
@@ -174,20 +172,121 @@ namespace AMDiS {
     return(*(const_cast<const FixVec<int,WORLD>* >(val)));
   }
 
-  void Tetrahedron::getVertexDofs(FiniteElemSpace* feSpace, int ithEdge, 
+  void Tetrahedron::getVertexDofs(FiniteElemSpace* feSpace, 
+				  int ith, int elType,
 				  DofContainer& dofs, bool parentVertices) const
   {
     FUNCNAME("Tetrahedron::getVertexDofs()");
-    
-    ERROR_EXIT("Not yet implemented!\n");
+
+    if (parentVertices) {
+      switch (ith) {
+      case 0:
+	dofs.push_back(dof[1]); dofs.push_back(dof[2]), dofs.push_back(dof[3]);
+	break;
+      case 1:
+	dofs.push_back(dof[0]); dofs.push_back(dof[2]), dofs.push_back(dof[3]);
+	break;
+      case 2:
+	dofs.push_back(dof[0]); dofs.push_back(dof[1]), dofs.push_back(dof[3]);
+	break;
+      case 3:
+	dofs.push_back(dof[0]); dofs.push_back(dof[1]), dofs.push_back(dof[2]);
+	break;
+      default:
+	ERROR_EXIT("Should never happen!\n");
+      }
+    }
+
+    switch (ith) {
+    case 0:
+      {
+	if (sideOfChild[elType][0][ith] != -1) {
+	  std::cout << "ERROR 1 WITH elType = " << elType << "!\n";
+	  exit(0);
+	}
+
+	Element *child1 = child[1];
+	if (child1 && child1->getFirstChild()) {
+	  int c1 = sideOfChild[elType][1][ith];
+	  int c2 = sideOfChild[(elType + 1) % 3][0][c1];
+	  int c3 = sideOfChild[(elType + 1) % 3][1][c1];
+
+	  child1->getFirstChild()->getVertexDofs(feSpace, c2, (elType + 2) % 3, dofs);
+	  dofs.push_back(child1->getFirstChild()->getDOF(3));
+	  child1->getSecondChild()->getVertexDofs(feSpace, c3, (elType + 2) % 3, dofs);
+	}
+      }
+      break;
+    case 1:
+      {
+	if (sideOfChild[elType][1][ith] != -1) {
+	  std::cout << "ERROR 2 WITH elType = " << elType << "!\n";
+	  exit(0);
+	}
+
+	Element *child0 = child[0];
+	if (child0 && child0->getFirstChild()) {
+	  int c1 = sideOfChild[elType][0][ith];
+	  int c2 = sideOfChild[(elType + 1) % 3][0][c1];
+	  int c3 = sideOfChild[(elType + 1) % 3][1][c1];
+
+	  child0->getFirstChild()->getVertexDofs(feSpace, c2, (elType + 2) % 3, dofs);
+	  dofs.push_back(child0->getFirstChild()->getDOF(3));
+	  child0->getSecondChild()->getVertexDofs(feSpace, c3, (elType + 2) % 3, dofs);
+	}
+      }
+      break;
+
+    case 2:
+    case 3:
+      {
+	if (child[0]) {
+	  int c1 = sideOfChild[elType][0][ith];
+	  int c2 = sideOfChild[elType][1][ith];
+
+	  if (c1 == -1 || c2 == -1) {
+	    std::cout << "ERROR 3 WITH elType = " << elType << std::endl;
+	    exit(0);
+	  }
+
+	  child[0]->getVertexDofs(feSpace, c1, (elType + 1) % 3, dofs);
+	  dofs.push_back(child[0]->getDOF(3));
+	  child[1]->getVertexDofs(feSpace, c2, (elType + 1) % 3, dofs);
+	}
+      }
+      break;
+    default:
+      ERROR_EXIT("Should never happen!\n");
+    }
   }
 
-  void Tetrahedron::getNonVertexDofs(FiniteElemSpace* feSpace, int ithEdge, 
+  void Tetrahedron::getNonVertexDofs(FiniteElemSpace* feSpace,
+				     int ith, int elType,
 				     DofContainer& dofs) const
   {
     FUNCNAME("Tetrahedron::getNonVertexDofs()");
-    
-    ERROR_EXIT("Not yet implemented!\n");
+
+    if (child[0]) {
+      int childFace0 = sideOfChild[elType][0][ith];
+      int childFace1 = sideOfChild[elType][0][ith];
+
+      TEST_EXIT(childFace0 != -1 || childFace1 != -1)
+	("No new face for child elements!\n");
+
+      if (childFace0 != -1) 
+	child[0]->getNonVertexDofs(feSpace, childFace0, (elType + 1) % 3, dofs);
+
+      if (childFace1 != -1) 
+	child[1]->getNonVertexDofs(feSpace, childFace1, (elType + 1) % 3, dofs);
+    } else { 
+      ElementDofIterator elDofIter(feSpace, true);
+      elDofIter.reset(this);
+      do {
+	if (elDofIter.getCurrentPos() == 2 && 
+	    elDofIter.getCurrentElementPos() == ith)
+	  dofs.push_back(elDofIter.getDofPtr());		
+      } while(elDofIter.next());      
+    }
   }
 
 }
diff --git a/AMDiS/src/Tetrahedron.h b/AMDiS/src/Tetrahedron.h
index f56e49f1..329d2460 100644
--- a/AMDiS/src/Tetrahedron.h
+++ b/AMDiS/src/Tetrahedron.h
@@ -129,10 +129,10 @@ namespace AMDiS {
       return "Tetrahedron"; 
     }
 
-    void getVertexDofs(FiniteElemSpace* feSpace, int ithEdge, 
+    void getVertexDofs(FiniteElemSpace* feSpace, int ith, int elType,
 		       DofContainer& dofs, bool parentVertices = 0) const;
 
-    void getNonVertexDofs(FiniteElemSpace* feSpace, int ithEdge, 
+    void getNonVertexDofs(FiniteElemSpace* feSpace, int ith, int elType,
 			  DofContainer& dofs) const;
 
   public:
diff --git a/AMDiS/src/Triangle.cc b/AMDiS/src/Triangle.cc
index 65bcc2ea..8b20f104 100644
--- a/AMDiS/src/Triangle.cc
+++ b/AMDiS/src/Triangle.cc
@@ -45,9 +45,8 @@ namespace AMDiS {
     static MatrixOfFixVecs<FixVec<int,WORLD> > *sorted_2d = NULL;
 
     int no = 0;
-    const int *vof = NULL;
     FixVec<int,WORLD> *val = NULL;
-    vof = vertexOfEdge[face];
+    const int *vof = vertexOfEdge[face];
 
     if (NULL == sorted_2d) {
       sorted_2d = new MatrixOfFixVecs<FixVec<int,WORLD> >(2, 3, 2, NO_INIT);
@@ -76,7 +75,8 @@ namespace AMDiS {
   }
 
 
-  void Triangle::getVertexDofs(FiniteElemSpace* feSpace, int ithEdge, 
+  void Triangle::getVertexDofs(FiniteElemSpace* feSpace, 
+			       int ithEdge, int elType,
 			       DofContainer& dofs, bool parentVertices) const
   {
     FUNCNAME("Triangle::getVertexDofs()");
@@ -102,9 +102,9 @@ namespace AMDiS {
       {
 	Element *child1 = child[1];
 	if (child1 && child1->getFirstChild()) {
-	  child1->getFirstChild()->getVertexDofs(feSpace, 0, dofs);
+	  child1->getFirstChild()->getVertexDofs(feSpace, 0, elType, dofs);
 	  dofs.push_back(child1->getFirstChild()->getDOF(2));
-	  child1->getSecondChild()->getVertexDofs(feSpace, 1, dofs);
+	  child1->getSecondChild()->getVertexDofs(feSpace, 1, elType, dofs);
 	}
       }
       break;
@@ -112,17 +112,17 @@ namespace AMDiS {
       {
 	Element *child0 = child[0];
 	if (child0 && child0->getFirstChild()) {
-	  child0->getFirstChild()->getVertexDofs(feSpace, 0, dofs);
+	  child0->getFirstChild()->getVertexDofs(feSpace, 0, elType, dofs);
 	  dofs.push_back(child[0]->getFirstChild()->getDOF(2));
-	  child0->getSecondChild()->getVertexDofs(feSpace, 1, dofs);
+	  child0->getSecondChild()->getVertexDofs(feSpace, 1, elType, dofs);
 	}
       }
       break;
     case 2:      
       if (child[0]) {
-	child[0]->getVertexDofs(feSpace, 0, dofs);
+	child[0]->getVertexDofs(feSpace, 0, elType, dofs);
 	dofs.push_back(child[0]->getDOF(2));
-	child[1]->getVertexDofs(feSpace, 1, dofs);
+	child[1]->getVertexDofs(feSpace, 1, elType, dofs);
       }
       break;      
     default:
@@ -147,7 +147,8 @@ namespace AMDiS {
   }
 
 
-  void Triangle::getNonVertexDofs(FiniteElemSpace* feSpace, int ithEdge, 
+  void Triangle::getNonVertexDofs(FiniteElemSpace* feSpace, 
+				  int ithEdge, int elType,
 				  DofContainer& dofs) const
   {
     FUNCNAME("Triange::getNonVertexDofs()");
@@ -157,22 +158,22 @@ namespace AMDiS {
     switch (ithEdge) {
     case 0:
       if (child[1])
-	child[1]->getNonVertexDofs(feSpace, 2, dofs);
+	child[1]->getNonVertexDofs(feSpace, 2, elType, dofs);
       else
 	addThisEdge = true;
 
       break;
     case 1:
       if (child[0])
-	child[0]->getNonVertexDofs(feSpace, 2, dofs);
+	child[0]->getNonVertexDofs(feSpace, 2, elType, dofs);
       else
 	addThisEdge = true;
 
       break;
     case 2:
       if (child[0]) {
-	child[0]->getNonVertexDofs(feSpace, 0, dofs);
-	child[1]->getNonVertexDofs(feSpace, 1, dofs);
+	child[0]->getNonVertexDofs(feSpace, 0, elType, dofs);
+	child[1]->getNonVertexDofs(feSpace, 1, elType, dofs);
       } else {
 	addThisEdge = true;
       } 
diff --git a/AMDiS/src/Triangle.h b/AMDiS/src/Triangle.h
index f149bd3d..fe2f7bd9 100644
--- a/AMDiS/src/Triangle.h
+++ b/AMDiS/src/Triangle.h
@@ -150,10 +150,12 @@ namespace AMDiS {
       return "Triangle"; 
     }
 
-    void getVertexDofs(FiniteElemSpace* feSpace, int ithEdge, 
+    void getVertexDofs(FiniteElemSpace* feSpace, 
+		       int ithEdge, int elType,
 		       DofContainer& dofs, bool parentVertices = 0) const;
 
-    void getNonVertexDofs(FiniteElemSpace* feSpace, int ithEdge, 
+    void getNonVertexDofs(FiniteElemSpace* feSpace, 
+			  int ithEdge, int elType,
 			  DofContainer& dofs) const;
 
   protected:
-- 
GitLab