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