From e41a4ba0b84e5b419878647c93e894f28f7c4125 Mon Sep 17 00:00:00 2001
From: Thomas Witkowski <thomas.witkowski@gmx.de>
Date: Tue, 9 Jun 2009 10:25:17 +0000
Subject: [PATCH] bugfix: solution vector was not passed to solver library.

---
 AMDiS/libtool            |  70 ++---
 AMDiS/src/MacroReader.cc | 563 ++++++++++++++++++++-------------------
 AMDiS/src/MacroReader.h  |   2 +-
 AMDiS/src/OEMSolver.h    |  20 +-
 4 files changed, 346 insertions(+), 309 deletions(-)

diff --git a/AMDiS/libtool b/AMDiS/libtool
index ff7a318f..3b667337 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="/usr/bin/sed"
+SED="/bin/sed"
 
 # Sed that helps us avoid accidentally triggering echo(1) options like -n.
-Xsed="/usr/bin/sed -e 1s/^X//"
+Xsed="/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 p2q023:
+# Libtool was configured on host NWRW15:
 
 # Shell to use when invoking shell scripts.
 SHELL="/bin/sh"
@@ -66,12 +66,12 @@ fast_install=yes
 
 # The host system.
 host_alias=
-host=x86_64-unknown-linux-gnu
+host=i686-pc-linux-gnu
 host_os=linux-gnu
 
 # The build system.
 build_alias=
-build=x86_64-unknown-linux-gnu
+build=i686-pc-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="mpicc"
+LTCC="gcc"
 
 # LTCC compiler flags.
 LTCFLAGS="-g -O2"
 
 # A language-specific compiler.
-CC="mpicc"
+CC="gcc"
 
 # Is the compiler the GNU C compiler?
 with_gcc=yes
 
-gcc_dir=`gcc -print-file-name=. | /usr/bin/sed 's,/\.$,,'`
+gcc_dir=`gcc -print-file-name=. | /bin/sed 's,/\.$,,'`
 gcc_ver=`gcc -dumpversion`
 
 # An ERE matcher.
 EGREP="grep -E"
 
 # The linker used to build libraries.
-LD="/usr/bin/ld -m elf_x86_64"
+LD="/usr/bin/ld"
 
 # 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=""
+link_static_flag="-static"
 
 # 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 "/lib64 /usr/lib64 /usr/local/lib64" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"`
+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"`
 
 # Run-time system search path for libraries
-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 "
+sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/octave-2.9.9 /usr/lib/qt-3.3/lib "
 
 # 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 p2q023:
+# Libtool was configured on host NWRW15:
 
 # Shell to use when invoking shell scripts.
 SHELL="/bin/sh"
@@ -6785,12 +6785,12 @@ fast_install=yes
 
 # The host system.
 host_alias=
-host=x86_64-unknown-linux-gnu
+host=i686-pc-linux-gnu
 host_os=linux-gnu
 
 # The build system.
 build_alias=
-build=x86_64-unknown-linux-gnu
+build=i686-pc-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="mpicc"
+LTCC="gcc"
 
 # LTCC compiler flags.
 LTCFLAGS="-g -O2"
 
 # A language-specific compiler.
-CC="mpiCC"
+CC="g++"
 
 # Is the compiler the GNU C compiler?
 with_gcc=yes
 
-gcc_dir=`gcc -print-file-name=. | /usr/bin/sed 's,/\.$,,'`
+gcc_dir=`gcc -print-file-name=. | /bin/sed 's,/\.$,,'`
 gcc_ver=`gcc -dumpversion`
 
 # An ERE matcher.
 EGREP="grep -E"
 
 # The linker used to build libraries.
-LD="/usr/bin/ld -m elf_x86_64"
+LD="/usr/bin/ld"
 
 # 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=""
+link_static_flag="-static"
 
 # 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/../lib64/crti.o /work/licsoft/compilers/gcc/4.2.4/lib/gcc/x86_64-unknown-linux-gnu/4.2.4/crtbeginS.o" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"`
+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"`
 
 # Dependencies to place after the objects being linked to create a
 # shared library.
-postdep_objects=`echo "/work/licsoft/compilers/gcc/4.2.4/lib/gcc/x86_64-unknown-linux-gnu/4.2.4/crtendS.o /usr/lib/../lib64/crtn.o" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"`
+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"`
 
 # 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="-lmpi_cxx -lmpi -lopen-rte -lopen-pal -libverbs -lrt -lnuma -ldl -lnsl -lutil -ldl -lstdc++ -lm -lgcc_s -lc -lgcc_s"
+postdeps="-lstdc++ -lm -lgcc_s -lc -lgcc_s"
 
 # The library search path used internally by the compiler when linking
 # a shared library.
-compiler_lib_search_path=`echo "-L/usr/lib64 -L/licsoft/libraries/openmpi/1.2.6/64bit/lib -L/work/licsoft/compilers/gcc/4.2.4/lib/gcc/x86_64-unknown-linux-gnu/4.2.4 -L/work/licsoft/compilers/gcc/4.2.4/lib/gcc/x86_64-unknown-linux-gnu/4.2.4/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/work/licsoft/compilers/gcc/4.2.4/lib/gcc/x86_64-unknown-linux-gnu/4.2.4/../../.." | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"`
+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"`
 
 # 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 "/lib64 /usr/lib64 /usr/local/lib64" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"`
+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"`
 
 # Run-time system search path for libraries
-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 "
+sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/octave-2.9.9 /usr/lib/qt-3.3/lib "
 
 # 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 p2q023:
+# Libtool was configured on host NWRW15:
 
 # Shell to use when invoking shell scripts.
 SHELL="/bin/sh"
@@ -7093,12 +7093,12 @@ fast_install=yes
 
 # The host system.
 host_alias=
-host=x86_64-unknown-linux-gnu
+host=i686-pc-linux-gnu
 host_os=linux-gnu
 
 # The build system.
 build_alias=
-build=x86_64-unknown-linux-gnu
+build=i686-pc-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="mpicc"
+LTCC="gcc"
 
 # LTCC compiler flags.
 LTCFLAGS="-g -O2"
@@ -7118,16 +7118,16 @@ LTCFLAGS="-g -O2"
 CC="g77"
 
 # Is the compiler the GNU C compiler?
-with_gcc=
+with_gcc=yes
 
-gcc_dir=`gcc -print-file-name=. | /usr/bin/sed 's,/\.$,,'`
+gcc_dir=`gcc -print-file-name=. | /bin/sed 's,/\.$,,'`
 gcc_ver=`gcc -dumpversion`
 
 # An ERE matcher.
 EGREP="grep -E"
 
 # The linker used to build libraries.
-LD="/usr/bin/ld -m elf_x86_64"
+LD="/usr/bin/ld"
 
 # 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 "/lib64 /usr/lib64 /usr/local/lib64" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"`
+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"`
 
 # Run-time system search path for libraries
-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 "
+sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/octave-2.9.9 /usr/lib/qt-3.3/lib "
 
 # Fix the shell variable $srcfile for the compiler.
 fix_srcfile_path=""
diff --git a/AMDiS/src/MacroReader.cc b/AMDiS/src/MacroReader.cc
index bf5c01f2..8e009e3e 100644
--- a/AMDiS/src/MacroReader.cc
+++ b/AMDiS/src/MacroReader.cc
@@ -183,7 +183,7 @@ namespace AMDiS {
 
 	  std::map<BoundaryType, VertexVector*>::iterator assoc;
 	  std::map<BoundaryType, VertexVector*>::iterator assocEnd =
-	      mesh->periodicAssociations.end();
+	    mesh->periodicAssociations.end();
 
 	  for (assoc = mesh->periodicAssociations.begin(); 
 	       assoc != assocEnd; 
@@ -201,7 +201,7 @@ namespace AMDiS {
 
       std::map<BoundaryType, VertexVector*>::iterator assoc;
       std::map<BoundaryType, VertexVector*>::iterator assocEnd =
-	  mesh->periodicAssociations.end();
+	mesh->periodicAssociations.end();
       for (assoc = mesh->periodicAssociations.begin(); 
 	   assoc != assocEnd; 
 	   ++assoc) {
@@ -234,11 +234,11 @@ namespace AMDiS {
     if (!macroInfo->neigh_set) {
       TEST_EXIT(!periodicFile)
 	("periodic boundary condition => element neighbours must be set\n");
-	computeNeighbours(mesh);
+      computeNeighbours(mesh);
     } else {
-	/****************************************************************************/
-	/* fill MEL oppVertex values when reading neighbour information form file  */
-	/****************************************************************************/
+      /****************************************************************************/
+      /* fill MEL oppVertex values when reading neighbour information form file  */
+      /****************************************************************************/
 
       for (int i = 0; i < mesh->getNumberOfMacros(); i++) {
 	for (int k = 0; k < mesh->getGeo(NEIGH); k++) {
@@ -444,9 +444,9 @@ namespace AMDiS {
   {
     for (int i = 0; i < N_KEYS; i++)
       if (!strcmp(keys[i], key))  
-	return(i);
+	return i;
 
-    return(-1);
+    return -1;
   }
 
 #include <ctype.h>
@@ -457,7 +457,7 @@ namespace AMDiS {
     char *k = key;
 
     while (isspace(*line)) 
-	line++;
+      line++;
     while ((*k++ = *line++) != ':');
     *--k = '\0';
   
@@ -480,8 +480,8 @@ namespace AMDiS {
     int dim;
     int dow, nv, ne, j, k;
     double dbl;
-    char name[128], line[256];
-    int line_no, n_keys, i_key, sort_key[N_KEYS], nv_key, ne_key;
+    char line[256];
+    int line_no, n_keys, sort_key[N_KEYS], nv_key, ne_key;
     int key_def[N_KEYS] = {0,0,0,0,0,0,0,0,0,0,0,0};
     const char *key;
     DimVec<int> *ind = NULL;
@@ -492,7 +492,6 @@ namespace AMDiS {
 
     file = fopen(filename, "r");
     TEST_EXIT(file)("cannot open file %s\n", filename);
-    strncpy(name, filename, 127);
 
     /****************************************************************************/
     /*  looking for all keys in the macro file ...                              */
@@ -500,301 +499,331 @@ namespace AMDiS {
 
     line_no = n_keys = 0;
     while (fgets(line, 255, file)) {
-	line_no++;
-	if (!strchr(line, ':'))  continue;
-	key = read_key(line);
-	i_key = get_key_no(key);
-	TEST_EXIT(i_key >= 0)
-	  ("macro file %s must not contain key %s on line %d\n",
-	   name, key, line_no);
-	TEST_EXIT(!key_def[i_key])
-	  ("key %s defined second time on line %d in file %s\n");
-
-	sort_key[n_keys++] = i_key;
-	key_def[i_key] = true;
+      line_no++;
+      if (!strchr(line, ':'))  continue;
+      key = read_key(line);
+      int i_key = get_key_no(key);
+      TEST_EXIT(i_key >= 0)
+	("macro file %s must not contain key %s on line %d\n",
+	 filename, key, line_no);
+      TEST_EXIT(!key_def[i_key])("key %s defined second time on line %d in file %s\n");
+
+      sort_key[n_keys++] = i_key;
+      key_def[i_key] = true;
     }
-
     fclose(file);
-    for (i_key = 0; i_key < N_MIN_KEYS; i_key++) {
-	for (j = 0; j < n_keys; j++)
-	    if (sort_key[j] == i_key)  break;
-	TEST_EXIT(j < n_keys)("You do not have specified data for %s in %s\n",
-			      keys[i_key], name);
-
-	for (j = 0; j < n_keys; j++)
-	  if (sort_key[j] == 2)  break;
-	nv_key = j;
-	for (j = 0; j < n_keys; j++)
-	  if (sort_key[j] == 3)  break;
-	ne_key = j;
+
+
+    /*******************************************************************************/
+    /*  Test, if there is data for every key and if all is defined in right order. */
+    /*******************************************************************************/
+
+    for (int i_key = 0; i_key < N_MIN_KEYS; i_key++) {
+      for (j = 0; j < n_keys; j++)
+	if (sort_key[j] == i_key)  break;
+      TEST_EXIT(j < n_keys)("You do not have specified data for %s in %s\n",
+			    keys[i_key], filename);
+
+      for (j = 0; j < n_keys; j++)
+	if (sort_key[j] == 2)  break;
+      nv_key = j;
+      for (j = 0; j < n_keys; j++)
+	if (sort_key[j] == 3)  break;
+      ne_key = j;
     
-	switch(i_key) {
-	    case 0:
-	    case 1:
-		TEST_EXIT(sort_key[i_key] < 2)
-		    ("You have to specify DIM or mesh->getGeo(WORLD) before all other data\n");
-		break;
-	    case 4: 
-		TEST_EXIT(nv_key < i_key)
-		    ("Before reading data for %s, you have to specify the %s in file\n",
-		     keys[4], keys[2], name);
-		break;
-	    case 5: 
-		TEST_EXIT(nv_key < i_key  &&  ne_key < i_key)
-		    ("Before reading data for %s, you have to specify the %s and %s in file %s\n",
-		     keys[5], keys[3], keys[2], name);
-	    case 6:
-	    case 7:
-	    case 8:
-		TEST_EXIT(ne_key < i_key)
-		    ("Before reading data for %s, you have to specify the %s in file %s\n",
-		     keys[i_key], keys[3], name);
-	}
+      switch (i_key) {
+      case 0:
+      case 1:
+	TEST_EXIT(sort_key[i_key] < 2)
+	  ("You have to specify DIM or mesh->getGeo(WORLD) before all other data\n");
+	break;
+      case 4: 
+	TEST_EXIT(nv_key < i_key)
+	  ("Before reading data for %s, you have to specify the %s in file\n",
+	   keys[4], keys[2], filename);
+	break;
+      case 5: 
+	TEST_EXIT(nv_key < i_key  &&  ne_key < i_key)
+	  ("Before reading data for %s, you have to specify the %s and %s in file %s\n",
+	   keys[5], keys[3], keys[2], filename);
+      case 6:
+      case 7:
+      case 8:
+	TEST_EXIT(ne_key < i_key)
+	  ("Before reading data for %s, you have to specify the %s in file %s\n",
+	   keys[i_key], keys[3], filename);
+      }
     }
 
-    for (i_key = 0; i_key < N_KEYS; i_key++)
+    for (int i_key = 0; i_key < N_KEYS; i_key++)
       key_def[i_key] = false;
 
     /****************************************************************************/
     /*  and now, reading data ...                                               */
     /****************************************************************************/
 	
-    file = fopen(name, "r");
-    TEST_EXIT(file)("cannot open file %s\n",name);
+    file = fopen(filename, "r");
+    TEST_EXIT(file)("cannot open file %s\n", filename);
 
     int result;
 
-    for (i_key = 0; i_key < n_keys; i_key++) {
+    for (int i_key = 0; i_key < n_keys; i_key++) {
 
-	switch(sort_key[i_key]) {
-	  case 0:
-	    result = fscanf(file, "%*s %d", &dim);
-	    TEST_EXIT(result == 1)
-	      ("cannot read DIM correctly in file %s\n", name);
+      switch (sort_key[i_key]) {
+	
+      case 0:
+	// line "DIM"
+	result = fscanf(file, "%*s %d", &dim);
+	TEST_EXIT(result == 1)("cannot read DIM correctly in file %s\n", filename);
 
-	    ind = new DimVec<int>(dim, NO_INIT);
+	ind = new DimVec<int>(dim, NO_INIT);
 
-	    key_def[0] = true;
-	    break;
-	  case 1:
-	    result = fscanf(file, "%*s %d", &dow);
-	    TEST_EXIT(result == 1)
-	      ("cannot read Global::getGeo(WORLD) correctly in file %s\n", name);
-	    TEST_EXIT(dow == Global::getGeo(WORLD))
-	      ("dimension of world = %d != Global::getGeo(WORLD) = %d\n", 
-	       dow, Global::getGeo(WORLD));
+	key_def[0] = true;
+	break;
 
-	    key_def[1] = true;
-	    break;
-	  case 2:
-	    result = fscanf(file, "%*s %*s %*s %d", &nv);
-	    TEST_EXIT(result == 1)
-	      ("cannot read number of vertices correctly in file %s\n", name);
-	    TEST_EXIT(nv > 0)
-	      ("number of vertices = %d must be bigger than 0\n", nv);
+      case 1:
+	// line "DIM_OF_WORLD"
+	result = fscanf(file, "%*s %d", &dow);
+	TEST_EXIT(result == 1)
+	  ("cannot read Global::getGeo(WORLD) correctly in file %s\n", filename);
+	TEST_EXIT(dow == Global::getGeo(WORLD))
+	  ("dimension of world = %d != Global::getGeo(WORLD) = %d\n", 
+	   dow, Global::getGeo(WORLD));
 
-	    key_def[2] = true;
-	    if (key_def[3])
-	      fill(mesh, ne, nv);
-	    break;
-	  case 3:
-	    result = fscanf(file, "%*s %*s %*s %d", &ne);
+	key_def[1] = true;
+	break;
+
+      case 2:
+	// line "number of vertices"
+	result = fscanf(file, "%*s %*s %*s %d", &nv);
+	TEST_EXIT(result == 1)
+	  ("cannot read number of vertices correctly in file %s\n", filename);
+	TEST_EXIT(nv > 0)
+	  ("number of vertices = %d must be bigger than 0\n", nv);
+
+	key_def[2] = true;
+	if (key_def[3])
+	  fill(mesh, ne, nv);
+	break;
+
+      case 3:
+	// line "number of elements"
+	result = fscanf(file, "%*s %*s %*s %d", &ne);
+	TEST_EXIT(result == 1)
+	  ("cannot read number of elements correctly in file %s\n", filename);
+	TEST_EXIT(ne > 0)
+	  ("number of elements = %d must be bigger than 0\n", ne);
+
+	key_def[3] = true;
+	if (key_def[2])
+	  fill(mesh, ne, nv);
+	break;
+
+      case 4:
+	// block "vertex coordinates"
+	fscanf(file, "%*s %*s");
+	for (int i = 0; i < nv; i++) {
+	  for (j = 0; j <Global::getGeo(WORLD) ; j++) {
+	    result = fscanf(file, "%lf", &dbl);
 	    TEST_EXIT(result == 1)
-	      ("cannot read number of elements correctly in file %s\n", name);
-	    TEST_EXIT(ne > 0)
-	      ("number of elements = %d must be bigger than 0\n", ne);
+	      ("error while reading coordinates, check file %s\n", filename);
+	    coords[i][j] = dbl;
+	  }
+	}
+	key_def[4] = true;
+	break;
 
-	    key_def[3] = true;
-	    if (key_def[2])
-	      fill(mesh, ne, nv);
-	    break;
-	  case 4:
-	    fscanf(file, "%*s %*s");
-	    for (int i = 0; i < nv; i++) {
-	      for (j = 0; j <Global::getGeo(WORLD) ; j++) {
-		result = fscanf(file, "%lf", &dbl);
-		TEST_EXIT(result == 1)
-		  ("error while reading coordinates, check file %s\n", name);
-		coords[i][j] = dbl;
-	      }
-	    }
-	    key_def[4] = true;
-	    break;
-	  case 5:
-	    fscanf(file, "%*s %*s");
-	    /****************************************************************************/
-	    /* global number of vertices on a single element                            */
-	    /****************************************************************************/
-
-	    for (int i = 0; i < ne; i++) {
-	      result = read_indices(file, *ind);
-	      TEST_EXIT(result)
-		("cannot read vertex indices of element %d in file %s\n",  i, name);
-
-	      for (k = 0; k < mesh->getGeo(VERTEX); k++)
-		mel_vertex[i][k] = (*ind)[k];
-	    }
+      case 5:
+	// block "element vertices"
+	fscanf(file, "%*s %*s");
 
-	    key_def[5] = true;
-	    break;
-	  case 6:
-	    fscanf(file, "%*s %*s");
-	    /****************************************************************************/
-	    /* MEL boundary pointers                                                    */
-	    /****************************************************************************/
-	    for (int i = 0; i < ne; i++) {  
-                // boundary information of ith element 
-
-	      result = read_indices(file, *ind);
-	      TEST_EXIT(result)
-		("cannot read boundary type of element %d in file %s\n", i, name);
-
-	      // fill boundary of macro-element
-	      MacroReader::fillMelBoundary(mesh, 
-					   mel[i], 
-					   VecConv<int,NEIGH,PARTS>::convertVec((*ind), mesh));
-	    }
+	/****************************************************************************/
+	/* global number of vertices on a single element                            */
+	/****************************************************************************/
+
+	for (int i = 0; i < ne; i++) {
+	  result = read_indices(file, *ind);
+	  TEST_EXIT(result)
+	    ("cannot read vertex indices of element %d in file %s\n",  i, filename);
+
+	  for (k = 0; k < mesh->getGeo(VERTEX); k++)
+	    mel_vertex[i][k] = (*ind)[k];
+	}
+
+	key_def[5] = true;
+	break;
+
+      case 6:
+	// block "element boundaries"
+	fscanf(file, "%*s %*s");
+
+	/****************************************************************************/
+	/* MEL boundary pointers                                                    */
+	/****************************************************************************/
+	for (int i = 0; i < ne; i++) {  
+	  // boundary information of ith element 
 
-	    this->fillBoundaryInfo(mesh);
+	  result = read_indices(file, *ind);
+	  TEST_EXIT(result)
+	    ("cannot read boundary type of element %d in file %s\n", i, filename);
+
+	  // fill boundary of macro-element
+	  MacroReader::fillMelBoundary(mesh, 
+				       mel[i], 
+				       VecConv<int,NEIGH,PARTS>::convertVec((*ind), mesh));
+	}
+
+	this->fillBoundaryInfo(mesh);
                    
-	    bound_set = true;
-	    key_def[6] = true;
-	    break;
-	  case 7:
-	    fscanf(file, "%*s %*s");
-	    /****************************************************************************/
-	    /* fill MEL neighbour pointers:                                             */
-	    /*   if they are specified in the file: read them from file,                */
-	    /*   else init them by a call of fill_mel_neighbour()                       */
-	    /****************************************************************************/
-	    neigh_set = true;
-	    for (int i = 0; i < ne; i++) {
-                //  neighbour information about ith element
-
-		if (read_indices(file, *ind))
-		  MacroReader::fillMelNeigh(mel[i], mel, 
-					    VecConv<int,NEIGH,PARTS>::convertVec((*ind), 
-										 mesh));
-		else {
-		  neigh_set = false; /* setting of neighbours fails :-( */
-		  break;
-		}
-	      }
+	bound_set = true;
+	key_def[6] = true;
+	break;
 
-	    key_def[7] = true;
-	    break;
-	  case 8:
-	    fscanf(file, "%*s %*s");
-	    /****************************************************************************/
-	    /* MEL elType                                                               */
-	    /****************************************************************************/
-
-	    if (dim == 2 || dim == 1)
-	      ERROR("there is no element type in 2d and 2d; ignoring data for elType\n");
-
-	    for (int i = 0; i < ne; i++) {
-	      result = fscanf(file, "%d", &j);
-	      TEST_EXIT(result == 1)
-		("cannot read elType of element %d in file %s\n",
-		 i, name);
-	      if (dim == 3) {
-		(mel)[i]->elType = j;
-	      }
-	    }
+      case 7:
+	// block "element neighbours"
+	fscanf(file, "%*s %*s");
 
-	    key_def[8] = true;
+	/****************************************************************************/
+	/* fill MEL neighbour pointers:                                             */
+	/*   if they are specified in the file: read them from file,                */
+	/*   else init them by a call of fill_mel_neighbour()                       */
+	/****************************************************************************/
+	neigh_set = true;
+	for (int i = 0; i < ne; i++) {
+	  //  neighbour information about ith element
+
+	  if (read_indices(file, *ind)) {
+	    MacroReader::fillMelNeigh(mel[i], mel, 
+				      VecConv<int,NEIGH,PARTS>::convertVec((*ind), 
+									   mesh));
+	  } else {
+	    neigh_set = false; /* setting of neighbours fails :-( */
 	    break;
-	  case 9:
-	    {
-	      fscanf(file, "%*s");
+	  }
+	}
 
-	      int numFaces = mesh->getGeo(FACE);
-	      int numEdgesAtBoundary = 0;
+	key_def[7] = true;
+	break;
 
-	      for (k = 1; k < dim; k++) {
-		numEdgesAtBoundary += k;
-	      }
+      case 8:
+	// block "element type"
+	fscanf(file, "%*s %*s");
+	/****************************************************************************/
+	/* MEL elType                                                               */
+	/****************************************************************************/
 
-	      for (int i = 0; i < ne; i++) {
-		result = read_indices(file, *ind);
-		TEST_EXIT(result)
-		  ("cannot read boundary projector of element %d in file %s\n", i, name);
+	if (dim == 2 || dim == 1)
+	  ERROR("there is no element type in 2d and 2d; ignoring data for elType\n");
+
+	for (int i = 0; i < ne; i++) {
+	  result = fscanf(file, "%d", &j);
+	  TEST_EXIT(result == 1)
+	    ("cannot read elType of element %d in file %s\n", i, filename);
+	  if (dim == 3)
+	    (mel)[i]->elType = j;
+	}
+
+	key_def[8] = true;
+	break;
+
+      case 9:
+	// block "projections"
+	{
+	  fscanf(file, "%*s");
+
+	  int numFaces = mesh->getGeo(FACE);
+	  int numEdgesAtBoundary = 0;
+
+	  for (k = 1; k < dim; k++)
+	    numEdgesAtBoundary += k;
+
+	  for (int i = 0; i < ne; i++) {
+	    result = read_indices(file, *ind);
+	    TEST_EXIT(result)
+	      ("cannot read boundary projector of element %d in file %s\n", i, filename);
 	
-		Projection *projector = Projection::getProjection((*ind)[0]);
-
-		if(projector && projector->getType() == VOLUME_PROJECTION) {
-		  mel[i]->setProjection(0, projector);
-		} else { // boundary projection
-		  for(j = 0; j < mesh->getGeo(NEIGH); j++) {
-		    projector = Projection::getProjection((*ind)[j]);
-		    if(projector) {
-		      mel[i]->setProjection(j, projector);
-		      if(dim > 2) {
-			for(k = 0; k < numEdgesAtBoundary; k++) {
-			  int edgeNr = Global::getReferenceElement(dim)->getEdgeOfFace(j, k);
-			  mel[i]->setProjection(numFaces + edgeNr, projector);
-			}
-		      }
+	    Projection *projector = Projection::getProjection((*ind)[0]);
+
+	    if (projector && projector->getType() == VOLUME_PROJECTION) {
+	      mel[i]->setProjection(0, projector);
+	    } else { // boundary projection
+	      for(j = 0; j < mesh->getGeo(NEIGH); j++) {
+		projector = Projection::getProjection((*ind)[j]);
+		if(projector) {
+		  mel[i]->setProjection(j, projector);
+		  if(dim > 2) {
+		    for(k = 0; k < numEdgesAtBoundary; k++) {
+		      int edgeNr = Global::getReferenceElement(dim)->getEdgeOfFace(j, k);
+		      mel[i]->setProjection(numFaces + edgeNr, projector);
 		    }
 		  }
 		}
 	      }
 	    }
-	    key_def[9] = true;
-	    break;
-	  case 10:
-	    fscanf(file, "%*s %*s");
-	    /****************************************************************************/
-	    /* MEL regions                                                              */
-	    /****************************************************************************/
-
-	    for (int i = 0; i < ne; i++) {
-	      result = fscanf(file, "%d", &j);
-	      TEST_EXIT(result == 1)
-		("cannot read region of element %d in file %s\n", i, name);
-	      if (j >= 0) {
-		Element *el = mel[i]->getElement();
-		ElementRegion_ED *elementRegion = 
-		  new ElementRegion_ED(el->getElementData());
-		elementRegion->setRegion(j);
-		el->setElementData(elementRegion);
-	      }
-	    }
-	    key_def[10] = true;
-	    break;
-	  case 11:
-	    fscanf(file, "%*s %*s");
-	    for (int i = 0; i < ne; i++) {
-	      result = read_indices(file, *ind);
-	      TEST_EXIT(result)
-		("cannot read surface regions of element %d in file %s\n", i, name);
+	  }
+	}
+	key_def[9] = true;
+	break;
 
-	      Element *el = mel[i]->getElement();
+      case 10:
+	// block "element region"
+	fscanf(file, "%*s %*s");
+	/****************************************************************************/
+	/* MEL regions                                                              */
+	/****************************************************************************/
 
-	      for(j = 0; j < mesh->getGeo(NEIGH); j++) {
-		if((*ind)[j] >= 0) {
-		  SurfaceRegion_ED *surfaceRegion = 
-		    new SurfaceRegion_ED(el->getElementData());
-		  surfaceRegion->setSide(j);
-		  surfaceRegion->setRegion((*ind)[j]);
-		  el->setElementData(surfaceRegion);
-		}
-	      }
+	for (int i = 0; i < ne; i++) {
+	  result = fscanf(file, "%d", &j);
+	  TEST_EXIT(result == 1)
+	    ("cannot read region of element %d in file %s\n", i, filename);
+	  if (j >= 0) {
+	    Element *el = mel[i]->getElement();
+	    ElementRegion_ED *elementRegion = 
+	      new ElementRegion_ED(el->getElementData());
+	    elementRegion->setRegion(j);
+	    el->setElementData(elementRegion);
+	  }
+	}
+	key_def[10] = true;
+	break;
+
+      case 11:
+	// block "surface region"
+	fscanf(file, "%*s %*s");
+	for (int i = 0; i < ne; i++) {
+	  result = read_indices(file, *ind);
+	  TEST_EXIT(result)
+	    ("cannot read surface regions of element %d in file %s\n", i, filename);
+
+	  Element *el = mel[i]->getElement();
+
+	  for (j = 0; j < mesh->getGeo(NEIGH); j++) {
+	    if ((*ind)[j] >= 0) {
+	      SurfaceRegion_ED *surfaceRegion = 
+		new SurfaceRegion_ED(el->getElementData());
+	      surfaceRegion->setSide(j);
+	      surfaceRegion->setRegion((*ind)[j]);
+	      el->setElementData(surfaceRegion);
 	    }
-	    key_def[11] = true;
-	    break;
-	  case 12:
-	    fscanf(file, "%*s %*s %*s");
-	    break;
-	  case 13:
-	    fscanf(file, "%*s %*s");
-	    break;
 	  }
+	}
+	key_def[11] = true;
+	break;
+
+      case 12:
+	// line "mesh name"
+	fscanf(file, "%*s %*s %*s");
+	break;
+
+      case 13:
+	// line "time"
+	fscanf(file, "%*s %*s");
+	break;
       }
+    }
 
-    if (ind) {
+    if (ind)
       delete ind;
-    }
 
     fclose(file);
   }
@@ -1769,7 +1798,7 @@ namespace AMDiS {
 		 l[0],
 		 0,
 		 ele,
-		   umbvk);
+		 umbvk);
 	}
 	return;
       }
@@ -2109,8 +2138,8 @@ namespace AMDiS {
       TEST(dof = el->getDOF(i0))("no center dof???\n");
       int j0 = admin.getNumberOfPreDOFs(CENTER);
       TEST_EXIT(j0 + ndof <= mesh->getNumberOfDOFs(CENTER))
-      ("admin.getNumberOfPreDOFs(CENTER) %d + nDOF %d > mesh->nDOF %d\n",
-       j0, ndof, mesh->getNumberOfDOFs(CENTER));
+	("admin.getNumberOfPreDOFs(CENTER) %d + nDOF %d > mesh->nDOF %d\n",
+	 j0, ndof, mesh->getNumberOfDOFs(CENTER));
       for (int j = 0; j < ndof; j++) {
 	int jdof = dof[j0 + j];
 	TEST(jdof >= 0 && jdof < static_cast<int>(mesh->dof_used.size()))
diff --git a/AMDiS/src/MacroReader.h b/AMDiS/src/MacroReader.h
index d146840d..e15b639c 100644
--- a/AMDiS/src/MacroReader.h
+++ b/AMDiS/src/MacroReader.h
@@ -145,7 +145,7 @@ namespace AMDiS {
 
   protected:
     /// Reads indices from macro file
-    int  read_indices(FILE *file, DimVec<int> &id);
+    int read_indices(FILE *file, DimVec<int> &id);
   };
 }
 
diff --git a/AMDiS/src/OEMSolver.h b/AMDiS/src/OEMSolver.h
index a4d964ae..55175d2c 100644
--- a/AMDiS/src/OEMSolver.h
+++ b/AMDiS/src/OEMSolver.h
@@ -127,14 +127,17 @@ namespace AMDiS {
       // Copy rhs vector
       int counter = 0;
       DOFVector<double>::Iterator it_b(&b, USED_DOFS);
-      for (it_b.reset(); !it_b.end(); ++it_b)
-	bb[counter++] = *it_b;
+      DOFVector<double>::Iterator it_x(&x, USED_DOFS);
+      for (it_b.reset(), it_x.reset(); !it_b.end(); ++it_b, ++it_x) {	
+	bb[counter] = *it_b;
+	xx[counter] = *it_x;
+	counter++;
+      }
 	
       int r = solveSystem(A.getMatrix(), xx, bb);
 
       // Copy solution vector to DOFVector
       counter = 0;
-      DOFVector<double>::Iterator it_x(&x, USED_DOFS);
       for (it_x.reset(); !it_x.end(); ++it_x)
 	*it_x = xx[counter++];
 
@@ -152,9 +155,14 @@ namespace AMDiS {
       // Copy vectors
       mtl::dense_vector<value_type>   xx(size), bb(size);
       for (int i = 0, counter = 0; i < ns; i++) {
-	  DOFVector<double>::Iterator it(b.getDOFVector(i), USED_DOFS);	  
-	  for (it.reset(); !it.end(); ++it)	
-	      bb[counter++] = *it;	
+	  DOFVector<double>::Iterator it_b(b.getDOFVector(i), USED_DOFS);	  
+	  DOFVector<double>::Iterator it_x(x.getDOFVector(i), USED_DOFS);
+
+	  for (it_b.reset(), it_x.reset(); !it_b.end(); ++it_b, ++it_x) {	
+	      bb[counter] = *it_b;
+	      xx[counter] = *it_x;
+	      counter++;
+	  }
       }
 
       // Solver on DOFVector for single system
-- 
GitLab