From b2a88ee29e4fddff99c0d047fb278b270161818a Mon Sep 17 00:00:00 2001 From: Thomas Witkowski <thomas.witkowski@gmx.de> Date: Fri, 3 Jul 2009 08:46:24 +0000 Subject: [PATCH] n --- AMDiS/libtool | 70 ++++++------- AMDiS/src/ParallelDomainProblem.cc | 155 +++++++++++++++++------------ AMDiS/src/ParallelDomainProblem.h | 18 ++-- 3 files changed, 134 insertions(+), 109 deletions(-) diff --git a/AMDiS/libtool b/AMDiS/libtool index 3b667337..aeddb890 100755 --- a/AMDiS/libtool +++ b/AMDiS/libtool @@ -30,10 +30,10 @@ # the same distribution terms that you use for the rest of that program. # A sed program that does not truncate output. -SED="/bin/sed" +SED="/usr/bin/sed" # Sed that helps us avoid accidentally triggering echo(1) options like -n. -Xsed="/bin/sed -e 1s/^X//" +Xsed="/usr/bin/sed -e 1s/^X//" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. @@ -44,7 +44,7 @@ available_tags=" CXX F77" # ### BEGIN LIBTOOL CONFIG -# Libtool was configured on host NWRW15: +# Libtool was configured on host p2d072: # Shell to use when invoking shell scripts. SHELL="/bin/sh" @@ -66,12 +66,12 @@ fast_install=yes # The host system. host_alias= -host=i686-pc-linux-gnu +host=x86_64-unknown-linux-gnu host_os=linux-gnu # The build system. build_alias= -build=i686-pc-linux-gnu +build=x86_64-unknown-linux-gnu build_os=linux-gnu # An echo program that does not interpret backslashes. @@ -82,25 +82,25 @@ AR="ar" AR_FLAGS="cru" # A C compiler. -LTCC="gcc" +LTCC="/licsoft/libraries/openmpi/1.2.6/64bit/bin/mpicc" # LTCC compiler flags. LTCFLAGS="-g -O2" # A language-specific compiler. -CC="gcc" +CC="/licsoft/libraries/openmpi/1.2.6/64bit/bin/mpicc" # Is the compiler the GNU C compiler? with_gcc=yes -gcc_dir=`gcc -print-file-name=. | /bin/sed 's,/\.$,,'` +gcc_dir=`gcc -print-file-name=. | /usr/bin/sed 's,/\.$,,'` gcc_ver=`gcc -dumpversion` # An ERE matcher. EGREP="grep -E" # The linker used to build libraries. -LD="/usr/bin/ld" +LD="/usr/x86_64-suse-linux/bin/ld -m elf_x86_64" # Whether we need hard or soft links. LN_S="ln -s" @@ -174,7 +174,7 @@ dlopen_self=unknown dlopen_self_static=unknown # Compiler flag to prevent dynamic linking. -link_static_flag="-static" +link_static_flag="" # Compiler flag to turn off builtin functions. no_builtin_flag=" -fno-builtin" @@ -328,10 +328,10 @@ variables_saved_for_relink="PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COM link_all_deplibs=unknown # Compile-time system search path for libraries -sys_lib_search_path_spec=`echo " /usr/lib/gcc/i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../i386-redhat-linux/lib/i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../i386-redhat-linux/lib/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../ /lib/i386-redhat-linux/4.1.2/ /lib/ /usr/lib/i386-redhat-linux/4.1.2/ /usr/lib/" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"` +sys_lib_search_path_spec=`echo "/lib64 /usr/lib64 /usr/local/lib64" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"` # Run-time system search path for libraries -sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/octave-2.9.9 /usr/lib/qt-3.3/lib " +sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /usr/X11R6/lib64/Xaw3d /usr/X11R6/lib64 /usr/X11R6/lib/Xaw3d /usr/X11R6/lib /usr/x86_64-suse-linux/lib /usr/local/lib64 /usr/local/lib /opt/kde3/lib64 /opt/kde3/lib /opt/gnome/lib64 /opt/gnome/lib /lib64 /lib /usr/lib64 /usr/lib /opt/cluster/intel/cce/9.1.042/lib /opt/cluster/intel/fce/9.1.036/lib /opt/cluster/Pathscale3.0/lib/2.9.99 /opt/cluster/Pathscale3.0/lib/2.9.99/32 /work/licsoft/compilers/pgi/linux86-64/6.2/lib /work/licsoft/compilers/pgi/linux86-64/6.2/libso " # Fix the shell variable $srcfile for the compiler. fix_srcfile_path="" @@ -6763,7 +6763,7 @@ build_old_libs=`case $build_libtool_libs in yes) $echo no;; *) $echo yes;; esac` # End: # ### BEGIN LIBTOOL TAG CONFIG: CXX -# Libtool was configured on host NWRW15: +# Libtool was configured on host p2d072: # Shell to use when invoking shell scripts. SHELL="/bin/sh" @@ -6785,12 +6785,12 @@ fast_install=yes # The host system. host_alias= -host=i686-pc-linux-gnu +host=x86_64-unknown-linux-gnu host_os=linux-gnu # The build system. build_alias= -build=i686-pc-linux-gnu +build=x86_64-unknown-linux-gnu build_os=linux-gnu # An echo program that does not interpret backslashes. @@ -6801,25 +6801,25 @@ AR="ar" AR_FLAGS="cru" # A C compiler. -LTCC="gcc" +LTCC="/licsoft/libraries/openmpi/1.2.6/64bit/bin/mpicc" # LTCC compiler flags. LTCFLAGS="-g -O2" # A language-specific compiler. -CC="g++" +CC="/licsoft/libraries/openmpi/1.2.6/64bit/bin/mpiCC" # Is the compiler the GNU C compiler? with_gcc=yes -gcc_dir=`gcc -print-file-name=. | /bin/sed 's,/\.$,,'` +gcc_dir=`gcc -print-file-name=. | /usr/bin/sed 's,/\.$,,'` gcc_ver=`gcc -dumpversion` # An ERE matcher. EGREP="grep -E" # The linker used to build libraries. -LD="/usr/bin/ld" +LD="/usr/x86_64-suse-linux/bin/ld -m elf_x86_64" # Whether we need hard or soft links. LN_S="ln -s" @@ -6893,7 +6893,7 @@ dlopen_self=unknown dlopen_self_static=unknown # Compiler flag to prevent dynamic linking. -link_static_flag="-static" +link_static_flag="" # Compiler flag to turn off builtin functions. no_builtin_flag=" -fno-builtin" @@ -6948,11 +6948,11 @@ striplib="strip --strip-unneeded" # Dependencies to place before the objects being linked to create a # shared library. -predep_objects=`echo "/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crti.o /usr/lib/gcc/i386-redhat-linux/4.1.2/crtbeginS.o" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"` +predep_objects=`echo "/usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../lib64/crti.o /usr/lib64/gcc/x86_64-suse-linux/4.1.2/crtbeginS.o" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"` # Dependencies to place after the objects being linked to create a # shared library. -postdep_objects=`echo "/usr/lib/gcc/i386-redhat-linux/4.1.2/crtendS.o /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crtn.o" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"` +postdep_objects=`echo "/usr/lib64/gcc/x86_64-suse-linux/4.1.2/crtendS.o /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../lib64/crtn.o" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"` # Dependencies to place before the objects being linked to create a # shared library. @@ -6960,11 +6960,11 @@ predeps="" # Dependencies to place after the objects being linked to create a # shared library. -postdeps="-lstdc++ -lm -lgcc_s -lc -lgcc_s" +postdeps="-lmpi_cxx -lmpi -lopen-rte -lopen-pal -libverbs -lrt -lnuma -ldl -lnsl -lutil -ldl -lstdc++ -lm -lgcc_s -lpthread -lc -lgcc_s" # The library search path used internally by the compiler when linking # a shared library. -compiler_lib_search_path=`echo "-L/usr/lib/gcc/i386-redhat-linux/4.1.2 -L/usr/lib/gcc/i386-redhat-linux/4.1.2 -L/usr/lib/gcc/i386-redhat-linux/4.1.2/../../.." | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"` +compiler_lib_search_path=`echo "-L/usr/lib64 -L/licsoft/libraries/openmpi/1.2.6/64bit/lib -L/usr/lib64/gcc/x86_64-suse-linux/4.1.2 -L/usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../x86_64-suse-linux/lib -L/usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../.." | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"` # Method to check whether dependent libraries are shared objects. deplibs_check_method="pass_all" @@ -7044,10 +7044,10 @@ variables_saved_for_relink="PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COM link_all_deplibs=unknown # Compile-time system search path for libraries -sys_lib_search_path_spec=`echo " /usr/lib/gcc/i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../i386-redhat-linux/lib/i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../i386-redhat-linux/lib/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../i386-redhat-linux/4.1.2/ /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../ /lib/i386-redhat-linux/4.1.2/ /lib/ /usr/lib/i386-redhat-linux/4.1.2/ /usr/lib/" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"` +sys_lib_search_path_spec=`echo "/lib64 /usr/lib64 /usr/local/lib64" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"` # Run-time system search path for libraries -sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/octave-2.9.9 /usr/lib/qt-3.3/lib " +sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /usr/X11R6/lib64/Xaw3d /usr/X11R6/lib64 /usr/X11R6/lib/Xaw3d /usr/X11R6/lib /usr/x86_64-suse-linux/lib /usr/local/lib64 /usr/local/lib /opt/kde3/lib64 /opt/kde3/lib /opt/gnome/lib64 /opt/gnome/lib /lib64 /lib /usr/lib64 /usr/lib /opt/cluster/intel/cce/9.1.042/lib /opt/cluster/intel/fce/9.1.036/lib /opt/cluster/Pathscale3.0/lib/2.9.99 /opt/cluster/Pathscale3.0/lib/2.9.99/32 /work/licsoft/compilers/pgi/linux86-64/6.2/lib /work/licsoft/compilers/pgi/linux86-64/6.2/libso " # Fix the shell variable $srcfile for the compiler. fix_srcfile_path="" @@ -7071,7 +7071,7 @@ include_expsyms="" # ### BEGIN LIBTOOL TAG CONFIG: F77 -# Libtool was configured on host NWRW15: +# Libtool was configured on host p2d072: # Shell to use when invoking shell scripts. SHELL="/bin/sh" @@ -7093,12 +7093,12 @@ fast_install=yes # The host system. host_alias= -host=i686-pc-linux-gnu +host=x86_64-unknown-linux-gnu host_os=linux-gnu # The build system. build_alias= -build=i686-pc-linux-gnu +build=x86_64-unknown-linux-gnu build_os=linux-gnu # An echo program that does not interpret backslashes. @@ -7109,7 +7109,7 @@ AR="ar" AR_FLAGS="cru" # A C compiler. -LTCC="gcc" +LTCC="/licsoft/libraries/openmpi/1.2.6/64bit/bin/mpicc" # LTCC compiler flags. LTCFLAGS="-g -O2" @@ -7118,16 +7118,16 @@ LTCFLAGS="-g -O2" CC="g77" # Is the compiler the GNU C compiler? -with_gcc=yes +with_gcc= -gcc_dir=`gcc -print-file-name=. | /bin/sed 's,/\.$,,'` +gcc_dir=`gcc -print-file-name=. | /usr/bin/sed 's,/\.$,,'` gcc_ver=`gcc -dumpversion` # An ERE matcher. EGREP="grep -E" # The linker used to build libraries. -LD="/usr/bin/ld" +LD="/usr/x86_64-suse-linux/bin/ld -m elf_x86_64" # Whether we need hard or soft links. LN_S="ln -s" @@ -7355,10 +7355,10 @@ variables_saved_for_relink="PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COM link_all_deplibs=unknown # Compile-time system search path for libraries -sys_lib_search_path_spec=`echo " /usr/lib/gcc/i386-redhat-linux/3.4.6/ /usr/lib/gcc/i386-redhat-linux/3.4.6/ /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../i386-redhat-linux/lib/i386-redhat-linux/3.4.6/ /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../i386-redhat-linux/lib/ /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../i386-redhat-linux/3.4.6/ /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../ /lib/i386-redhat-linux/3.4.6/ /lib/ /usr/lib/i386-redhat-linux/3.4.6/ /usr/lib/" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"` +sys_lib_search_path_spec=`echo "/lib64 /usr/lib64 /usr/local/lib64" | $SED -e "s@${gcc_dir}@\${gcc_dir}@g;s@${gcc_ver}@\${gcc_ver}@g"` # Run-time system search path for libraries -sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/octave-2.9.9 /usr/lib/qt-3.3/lib " +sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /usr/X11R6/lib64/Xaw3d /usr/X11R6/lib64 /usr/X11R6/lib/Xaw3d /usr/X11R6/lib /usr/x86_64-suse-linux/lib /usr/local/lib64 /usr/local/lib /opt/kde3/lib64 /opt/kde3/lib /opt/gnome/lib64 /opt/gnome/lib /lib64 /lib /usr/lib64 /usr/lib /opt/cluster/intel/cce/9.1.042/lib /opt/cluster/intel/fce/9.1.036/lib /opt/cluster/Pathscale3.0/lib/2.9.99 /opt/cluster/Pathscale3.0/lib/2.9.99/32 /work/licsoft/compilers/pgi/linux86-64/6.2/lib /work/licsoft/compilers/pgi/linux86-64/6.2/libso " # Fix the shell variable $srcfile for the compiler. fix_srcfile_path="" diff --git a/AMDiS/src/ParallelDomainProblem.cc b/AMDiS/src/ParallelDomainProblem.cc index 2cd1e0dd..5acdb25f 100644 --- a/AMDiS/src/ParallelDomainProblem.cc +++ b/AMDiS/src/ParallelDomainProblem.cc @@ -36,7 +36,8 @@ namespace AMDiS { mesh(fe->getMesh()), refinementManager(refineManager), initialPartitionMesh(true), - nRankDOFs(0) + nRankDOFs(0), + rstart(0) { FUNCNAME("ParallelDomainBase::ParalleDomainBase()"); @@ -84,22 +85,19 @@ namespace AMDiS { createLocalGlobalNumbering(rankDOFs, boundaryDOFs, nRankDOFs, nOverallDOFs); - // === Create interior boundary information === createInteriorBoundaryInfo(rankDOFs, boundaryDOFs); + // === Remove all macro elements that are not part of the rank partition. === + + removeMacroElements(); + #if (DEBUG != 0) DbgTestElementMap(elMap); DbgTestInteriorBoundary(); #endif - exit(0); - - // === Remove all macro elements that are not part of the rank partition. === - - removeMacroElements(); - // === Reset all DOFAdmins of the mesh. === int nAdmins = mesh->getNumberOfDOFAdmin(); @@ -132,8 +130,6 @@ namespace AMDiS { DbgTestCommonDofs(); #endif - exit(0); - // === Create petsc matrix. === int ierr; @@ -238,11 +234,14 @@ namespace AMDiS { DOFVector<double>::Iterator dofIt(vec, USED_DOFS); int counter = 0; - for (dofIt.reset(); !dofIt.end(); ++dofIt) - *dofIt = vecPointer[counter++]; + for (dofIt.reset(); !dofIt.end(); ++dofIt) { + *dofIt = vecPointer[mapGlobalLocalDOFs[rstart + counter]]; + counter++; + } VecRestoreArray(petscSolVec, &vecPointer); +#if 0 std::vector<double*> sendBuffers(sendDofs.size()); std::vector<double*> recvBuffers(recvDofs.size()); @@ -291,6 +290,7 @@ namespace AMDiS { for (int i = 0; i < static_cast<int>(sendBuffers.size()); i++) delete [] sendBuffers[i]; +#endif } @@ -517,20 +517,50 @@ namespace AMDiS { // Stores to each DOF pointer the set of ranks the DOF is part of. std::map<const DegreeOfFreedom*, std::set<int> > partitionDOFs; + DofContainer rankAllDofs; - createDOFMemberInfo(partitionDOFs, rankDOFs, boundaryDOFs); + createDOFMemberInfo(partitionDOFs, rankDOFs, rankAllDofs, boundaryDOFs); nRankDOFs = rankDOFs.size(); nOverallDOFs = partitionDOFs.size(); - // === Get starting position for global rank dof ordering. ==== - int rstart = 0; + // int rstart = 0; mpiComm.Scan(&nRankDOFs, &rstart, 1, MPI_INT, MPI_SUM); rstart -= nRankDOFs; - + + typedef std::map<const DegreeOfFreedom*, DegreeOfFreedom> DofIndexMap; + DofIndexMap rankDofsNewLocalIndex, rankDofsNewGlobalIndex; + int i = 0; + for (DofContainer::iterator dofIt = rankAllDofs.begin(); + dofIt != rankAllDofs.end(); ++dofIt) { + rankDofsNewLocalIndex[*dofIt] = i++; + isRankDof[i] = true; + } + + i = 0; + for (DofContainer::iterator dofIt = rankDOFs.begin(); + dofIt != rankDOFs.end(); ++dofIt) { + rankDofsNewGlobalIndex[*dofIt] = i + rstart; + i++; + } + + if (mpiRank == 0) { + for (DofContainer::iterator dofIt = rankAllDofs.begin(); + dofIt != rankAllDofs.end(); ++dofIt) { + std::cout << "OLD DOF = " << **dofIt << " NEW L DOF = " << rankDofsNewLocalIndex[*dofIt]; + if (rankDofsNewGlobalIndex.find(*dofIt) != rankDofsNewGlobalIndex.end()) + std::cout << " NEW G DOF = " << rankDofsNewGlobalIndex[*dofIt]; + std::cout << std::endl; + } + } + + exit(0); + + + // === Create information which dof indices must be send and which must === // === be received. === @@ -549,21 +579,16 @@ namespace AMDiS { if (it->second == mpiRank) { // If the boundary dof is a rank dof, it must be send to other ranks. - // search for new dof index in ranks partition for this boundary dof - DegreeOfFreedom newDofIndex = 0; - for (int i = 0; i < nRankDOFs; i++) { - if (rankDOFs[i] == it->first) { - newDofIndex = rstart + i; - break; - } - } - // Search for all ranks that have this dof too. for (std::set<int>::iterator itRanks = partitionDOFs[it->first].begin(); itRanks != partitionDOFs[it->first].end(); ++itRanks) { - if (*itRanks != mpiRank) - sendNewDofs[*itRanks][it->first] = newDofIndex; + if (*itRanks != mpiRank) { + TEST_EXIT_DBG(rankDofsNewGlobalIndex.count(it->first) == 1) + ("DOF Key not found!\n"); + + sendNewDofs[*itRanks][it->first] = rankDofsNewGlobalIndex[it->first]; + } } } else { // If the boundary dof is not a rank dof, its new dof index, and later @@ -575,6 +600,7 @@ namespace AMDiS { } } + // === Send and receive the dof indices at boundary. === std::vector<int*> sendBuffers(sendNewDofs.size()), recvBuffers(recvNewDofs.size()); @@ -585,7 +611,7 @@ namespace AMDiS { MPI::Request request[sendNewDofs.size() + recvNewDofs.size()]; int requestCounter = 0; - int i = 0; + i = 0; for (std::map<int, std::map<const DegreeOfFreedom*, DegreeOfFreedom> >::iterator sendIt = sendNewDofs.begin(); sendIt != sendNewDofs.end(); @@ -637,15 +663,8 @@ namespace AMDiS { mapLocalGlobalDOFs.clear(); mapGlobalLocalDOFs.clear(); - isRankDOF.clear(); + isRankDof.clear(); - for (int i = 0; i < nRankDOFs; i++) { - *const_cast<DegreeOfFreedom*>(rankDOFs[i]) = i; - mapLocalGlobalDOFs[i] = rstart + i; - mapGlobalLocalDOFs[rstart + i] = i; - isRankDOF[i] = true; - } -#if 0 // === Change dof indices at boundary from other ranks. === // Within this small data structure we track which dof index was already changed. @@ -669,7 +688,6 @@ namespace AMDiS { DegreeOfFreedom oldDof = recvBuffers[i][j * 2]; DegreeOfFreedom newGlobalDof = recvBuffers[i][j * 2 + 1]; - DegreeOfFreedom newLocalDof = mapLocalGlobalDOFs.size(); bool found = false; @@ -682,11 +700,9 @@ namespace AMDiS { dofChanged[dofIt->first] = true; recvDofs[recvIt->first].push_back(dofIt->first); - *(const_cast<DegreeOfFreedom*>(dofIt->first)) = newLocalDof; + rankDofsNewGlobalIndex[dofIt->first] = newGlobalDof; + isRankDof[rankDofsNewLocalIndex[dofIt->first]] = false; - mapLocalGlobalDOFs[newLocalDof] = newGlobalDof; - mapGlobalLocalDOFs[newGlobalDof] = newLocalDof; - isRankDOF[newLocalDof] = false; found = true; break; } @@ -697,7 +713,16 @@ namespace AMDiS { delete [] recvBuffers[i]; } -#endif + + for (DofIndexMap::iterator dofIt = rankDofsNewLocalIndex.begin(); + dofIt != rankDofsNewLocalIndex.end(); ++dofIt) { + DegreeOfFreedom localDof = dofIt->second; + DegreeOfFreedom globalDof = rankDofsNewGlobalIndex[dofIt->first]; + + *const_cast<DegreeOfFreedom*>(dofIt->first) = localDof; + mapLocalGlobalDOFs[localDof] = globalDof; + mapGlobalLocalDOFs[globalDof] = localDof; + } } @@ -867,7 +892,7 @@ namespace AMDiS { mapLocalGlobalDOFs.clear(); mapGlobalLocalDOFs.clear(); - isRankDOF.clear(); + isRankDof.clear(); int i = 0; for (std::set<const DegreeOfFreedom*>::iterator dofIt = rankDOFs.begin(); @@ -875,7 +900,7 @@ namespace AMDiS { *(const_cast<DegreeOfFreedom*>(*dofIt)) = i; mapLocalGlobalDOFs[i] = rstart + i; mapGlobalLocalDOFs[rstart + i] = i; - isRankDOF[i] = true; + isRankDof[i] = true; } // === Send new DOF indices. === @@ -927,7 +952,7 @@ namespace AMDiS { (*const_cast<DegreeOfFreedom*>(*dofIt)) = newDofIndex; mapLocalGlobalDOFs[newDofIndex] = recvBuffers[i][j]; mapGlobalLocalDOFs[recvBuffers[i][j]] = newDofIndex; - isRankDOF[newDofIndex] = false; + isRankDof[newDofIndex] = false; newDofIndex++; j++; } @@ -1026,10 +1051,16 @@ namespace AMDiS { } - void ParallelDomainBase::createDOFMemberInfo(DofToPartitions& partitionDOFs, - DofContainer& rankDOFs, - DofToRank& boundaryDOFs) + void ParallelDomainBase::createDOFMemberInfo(DofToPartitions& partitionDofs, + DofContainer& rankOwnedDofs, + DofContainer& rankAllDofs, + DofToRank& boundaryDofs) { + partitionDofs.clear(); + rankOwnedDofs.clear(); + rankAllDofs.clear(); + boundaryDofs.clear(); + // === Determine to each dof the set of partitions the dof belongs to. === ElementDofIterator elDofIt(feSpace); @@ -1041,7 +1072,7 @@ namespace AMDiS { elDofIt.reset(element); do { // Determine to each dof the partition(s) it corresponds to. - partitionDOFs[elDofIt.getDofPtr()].insert(partitionVec[element->getIndex()]); + partitionDofs[elDofIt.getDofPtr()].insert(partitionVec[element->getIndex()]); } while(elDofIt.next()); elInfo = stack.traverseNext(elInfo); @@ -1051,18 +1082,18 @@ namespace AMDiS { // === Determine the set of ranks dofs and the dofs ownership at the boundary. === // iterate over all DOFs - for (DofToPartitions::iterator it = partitionDOFs.begin(); - it != partitionDOFs.end(); - ++it) { + for (DofToPartitions::iterator it = partitionDofs.begin(); + it != partitionDofs.end(); ++it) { // iterate over all partition the current DOF is part of. for (std::set<int>::iterator itpart1 = it->second.begin(); - itpart1 != it->second.end(); - ++itpart1) { + itpart1 != it->second.end(); ++itpart1) { if (*itpart1 == mpiRank) { + rankAllDofs.push_back(it->first); + if (it->second.size() == 1) { - rankDOFs.push_back(it->first); + rankOwnedDofs.push_back(it->first); } else { // This dof is at the ranks boundary. It is owned by the rank only if // the rank number is the highest of all ranks containing this dof. @@ -1070,8 +1101,7 @@ namespace AMDiS { bool insert = true; int highestRank = mpiRank; for (std::set<int>::iterator itpart2 = it->second.begin(); - itpart2 != it->second.end(); - ++itpart2) { + itpart2 != it->second.end(); ++itpart2) { if (*itpart2 > mpiRank) insert = false; @@ -1080,9 +1110,9 @@ namespace AMDiS { } if (insert) - rankDOFs.push_back(it->first); + rankOwnedDofs.push_back(it->first); - boundaryDOFs[it->first] = highestRank; + boundaryDofs[it->first] = highestRank; } break; @@ -1091,7 +1121,8 @@ namespace AMDiS { } } - sort(rankDOFs.begin(), rankDOFs.end(), cmpDofsByValue); + sort(rankAllDofs.begin(), rankAllDofs.end(), cmpDofsByValue); + sort(rankOwnedDofs.begin(), rankOwnedDofs.end(), cmpDofsByValue); } @@ -1107,7 +1138,6 @@ namespace AMDiS { ElInfo *elInfo = stack.traverseFirst(mesh, -1, Mesh::CALL_LEAF_EL); while (elInfo) { Element *el = elInfo->getElement(); - if (mpiRank == 0) std::cout << "EL = " << el->getIndex() << std::endl; orderDOFs(el->getDOF(0), el->getDOF(1), el->getDOF(2), elMap[el->getIndex()]); elInfo = stack.traverseNext(elInfo); } @@ -1124,7 +1154,6 @@ namespace AMDiS { ElInfo *elInfo = stack.traverseFirst(mesh, -1, Mesh::CALL_LEAF_EL); while (elInfo) { Element *el = elInfo->getElement(); - if (mpiRank == 0) std::cout << "EL = " << el->getIndex() << std::endl; orderDOFs(el->getDOF(0), el->getDOF(1), el->getDOF(2), vec); for (int i = 0; i < 3; i++) { if (elMap[el->getIndex()][i] != vec[i]) { @@ -1359,7 +1388,7 @@ namespace AMDiS { TEST_EXIT(m)("No DOF Matrix!\n"); - m->setIsRankDOF(isRankDOF); + m->setIsRankDOF(isRankDof); } void ParallelDomainScal::solve() diff --git a/AMDiS/src/ParallelDomainProblem.h b/AMDiS/src/ParallelDomainProblem.h index ef478fd0..152865ee 100644 --- a/AMDiS/src/ParallelDomainProblem.h +++ b/AMDiS/src/ParallelDomainProblem.h @@ -200,9 +200,10 @@ namespace AMDiS { * \param[out] boundaryDOFs Stores all DOFs in ranks partition that are on an * interior boundary but correspond to another rank. */ - void createDOFMemberInfo(DofToPartitions& partitionDOFs, - DofContainer& rankDOFs, - DofToRank& boundaryDOFs); + void createDOFMemberInfo(DofToPartitions& partitionDofs, + DofContainer& rankOwnedDofs, + DofContainer& rankAllDofs, + DofToRank& boundaryDofs); void DbgCreateElementMap(ElementIdxToDofs &elMap); @@ -225,13 +226,6 @@ namespace AMDiS { { vec.resize(3); - if (mpiRank == 0) - std::cout << "DOFS are: " - << dof1 << " = " << *dof1 << " " - << dof2 << " = " << *dof2 << " " - << dof3 << " = " << *dof3 << " " - << std::endl; - if (*dof1 < *dof2 && *dof1 < *dof3) vec[0] = dof1; else if (*dof2 < *dof1 && *dof2 < *dof3) @@ -364,7 +358,9 @@ namespace AMDiS { * owned by the rank. Otherwise, its an interior boundary DOF that is owned by * another rank. */ - DofToBool isRankDOF; + DofToBool isRankDof; + + int rstart; }; bool cmpDofsByValue(const DegreeOfFreedom* dof1, const DegreeOfFreedom* dof2) -- GitLab