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