From c4f4223d15bcab3c2ee1d48cfb06c1db4c53b8da Mon Sep 17 00:00:00 2001 From: Thomas Witkowski <thomas.witkowski@gmx.de> Date: Mon, 24 Jan 2011 10:10:15 +0000 Subject: [PATCH] Abstract interface for mesh partitioner. --- AMDiS/CMakeLists.txt | 1 + AMDiS/bin/Makefile.am | 1 + AMDiS/bin/Makefile.in | 12 +++ AMDiS/libtool | 64 ++++++------ AMDiS/src/Serializer.h | 3 + AMDiS/src/parallel/MeshDistributor.cc | 104 +++---------------- AMDiS/src/parallel/MeshDistributor.h | 11 +- AMDiS/src/parallel/MeshPartitioner.cc | 62 ++++++++++++ AMDiS/src/parallel/MeshPartitioner.h | 109 ++++++++++++++++++++ AMDiS/src/parallel/ParMetisPartitioner.cc | 116 ++-------------------- AMDiS/src/parallel/ParMetisPartitioner.h | 83 ++++------------ AMDiS/src/parallel/ParallelDebug.cc | 2 +- 12 files changed, 262 insertions(+), 306 deletions(-) create mode 100644 AMDiS/src/parallel/MeshPartitioner.cc create mode 100644 AMDiS/src/parallel/MeshPartitioner.h diff --git a/AMDiS/CMakeLists.txt b/AMDiS/CMakeLists.txt index f56f4fee..f7ac49d2 100644 --- a/AMDiS/CMakeLists.txt +++ b/AMDiS/CMakeLists.txt @@ -177,6 +177,7 @@ if(ENABLE_PARALLEL_DOMAIN) SET(PARALLEL_DOMAIN_AMDIS_SRC ${SOURCE_DIR}/parallel/ParMetisPartitioner.cc ${SOURCE_DIR}/parallel/MeshDistributor.cc + ${SOURCE_DIR}/parallel/MeshPartitioner.cc ${SOURCE_DIR}/parallel/MeshManipulation.cc ${SOURCE_DIR}/parallel/StdMpi.cc ${SOURCE_DIR}/parallel/ParallelDebug.cc diff --git a/AMDiS/bin/Makefile.am b/AMDiS/bin/Makefile.am index e9f356fd..bc35ae7a 100644 --- a/AMDiS/bin/Makefile.am +++ b/AMDiS/bin/Makefile.am @@ -18,6 +18,7 @@ if USE_PARALLEL_DOMAIN_AMDIS $(SOURCE_DIR)/parallel/StdMpi.h $(SOURCE_DIR)/parallel/StdMpi.cc \ $(SOURCE_DIR)/parallel/ParMetisPartitioner.h $(SOURCE_DIR)/parallel/ParMetisPartitioner.cc \ $(SOURCE_DIR)/parallel/MeshDistributor.h $(SOURCE_DIR)/parallel/MeshDistributor.cc \ + $(SOURCE_DIR)/parallel/MeshPartitioner.h $(SOURCE_DIR)/parallel/MeshPartitioner.cc \ $(SOURCE_DIR)/parallel/MeshManipulation.h $(SOURCE_DIR)/parallel/MeshManipulation.cc \ $(SOURCE_DIR)/parallel/ParallelDebug.h $(SOURCE_DIR)/parallel/ParallelDebug.cc \ $(SOURCE_DIR)/parallel/ParallelProblemStatBase.h \ diff --git a/AMDiS/bin/Makefile.in b/AMDiS/bin/Makefile.in index 9aa0041a..82e32247 100644 --- a/AMDiS/bin/Makefile.in +++ b/AMDiS/bin/Makefile.in @@ -40,6 +40,7 @@ host_triplet = @host@ @USE_PARALLEL_DOMAIN_AMDIS_TRUE@ $(SOURCE_DIR)/parallel/StdMpi.h $(SOURCE_DIR)/parallel/StdMpi.cc \ @USE_PARALLEL_DOMAIN_AMDIS_TRUE@ $(SOURCE_DIR)/parallel/ParMetisPartitioner.h $(SOURCE_DIR)/parallel/ParMetisPartitioner.cc \ @USE_PARALLEL_DOMAIN_AMDIS_TRUE@ $(SOURCE_DIR)/parallel/MeshDistributor.h $(SOURCE_DIR)/parallel/MeshDistributor.cc \ +@USE_PARALLEL_DOMAIN_AMDIS_TRUE@ $(SOURCE_DIR)/parallel/MeshPartitioner.h $(SOURCE_DIR)/parallel/MeshPartitioner.cc \ @USE_PARALLEL_DOMAIN_AMDIS_TRUE@ $(SOURCE_DIR)/parallel/MeshManipulation.h $(SOURCE_DIR)/parallel/MeshManipulation.cc \ @USE_PARALLEL_DOMAIN_AMDIS_TRUE@ $(SOURCE_DIR)/parallel/ParallelDebug.h $(SOURCE_DIR)/parallel/ParallelDebug.cc \ @USE_PARALLEL_DOMAIN_AMDIS_TRUE@ $(SOURCE_DIR)/parallel/ParallelProblemStatBase.h \ @@ -85,6 +86,8 @@ am__libamdis_la_SOURCES_DIST = $(SOURCE_DIR)/parallel/StdMpi.h \ $(SOURCE_DIR)/parallel/ParMetisPartitioner.cc \ $(SOURCE_DIR)/parallel/MeshDistributor.h \ $(SOURCE_DIR)/parallel/MeshDistributor.cc \ + $(SOURCE_DIR)/parallel/MeshPartitioner.h \ + $(SOURCE_DIR)/parallel/MeshPartitioner.cc \ $(SOURCE_DIR)/parallel/MeshManipulation.h \ $(SOURCE_DIR)/parallel/MeshManipulation.cc \ $(SOURCE_DIR)/parallel/ParallelDebug.h \ @@ -252,6 +255,7 @@ am__libamdis_la_SOURCES_DIST = $(SOURCE_DIR)/parallel/StdMpi.h \ @USE_PARALLEL_DOMAIN_AMDIS_TRUE@am__objects_1 = libamdis_la-StdMpi.lo \ @USE_PARALLEL_DOMAIN_AMDIS_TRUE@ libamdis_la-ParMetisPartitioner.lo \ @USE_PARALLEL_DOMAIN_AMDIS_TRUE@ libamdis_la-MeshDistributor.lo \ +@USE_PARALLEL_DOMAIN_AMDIS_TRUE@ libamdis_la-MeshPartitioner.lo \ @USE_PARALLEL_DOMAIN_AMDIS_TRUE@ libamdis_la-MeshManipulation.lo \ @USE_PARALLEL_DOMAIN_AMDIS_TRUE@ libamdis_la-ParallelDebug.lo \ @USE_PARALLEL_DOMAIN_AMDIS_TRUE@ libamdis_la-ParallelProblemStatBase.lo \ @@ -799,6 +803,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-Mesh.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-MeshDistributor.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-MeshManipulation.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-MeshPartitioner.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-MeshStructure.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-MpiHelper.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libamdis_la-NonLinUpdater.Plo@am__quote@ @@ -906,6 +911,13 @@ libamdis_la-MeshDistributor.lo: $(SOURCE_DIR)/parallel/MeshDistributor.cc @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libamdis_la_CXXFLAGS) $(CXXFLAGS) -c -o libamdis_la-MeshDistributor.lo `test -f '$(SOURCE_DIR)/parallel/MeshDistributor.cc' || echo '$(srcdir)/'`$(SOURCE_DIR)/parallel/MeshDistributor.cc +libamdis_la-MeshPartitioner.lo: $(SOURCE_DIR)/parallel/MeshPartitioner.cc +@am__fastdepCXX_TRUE@ if $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libamdis_la_CXXFLAGS) $(CXXFLAGS) -MT libamdis_la-MeshPartitioner.lo -MD -MP -MF "$(DEPDIR)/libamdis_la-MeshPartitioner.Tpo" -c -o libamdis_la-MeshPartitioner.lo `test -f '$(SOURCE_DIR)/parallel/MeshPartitioner.cc' || echo '$(srcdir)/'`$(SOURCE_DIR)/parallel/MeshPartitioner.cc; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libamdis_la-MeshPartitioner.Tpo" "$(DEPDIR)/libamdis_la-MeshPartitioner.Plo"; else rm -f "$(DEPDIR)/libamdis_la-MeshPartitioner.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$(SOURCE_DIR)/parallel/MeshPartitioner.cc' object='libamdis_la-MeshPartitioner.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libamdis_la_CXXFLAGS) $(CXXFLAGS) -c -o libamdis_la-MeshPartitioner.lo `test -f '$(SOURCE_DIR)/parallel/MeshPartitioner.cc' || echo '$(srcdir)/'`$(SOURCE_DIR)/parallel/MeshPartitioner.cc + libamdis_la-MeshManipulation.lo: $(SOURCE_DIR)/parallel/MeshManipulation.cc @am__fastdepCXX_TRUE@ if $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libamdis_la_CXXFLAGS) $(CXXFLAGS) -MT libamdis_la-MeshManipulation.lo -MD -MP -MF "$(DEPDIR)/libamdis_la-MeshManipulation.Tpo" -c -o libamdis_la-MeshManipulation.lo `test -f '$(SOURCE_DIR)/parallel/MeshManipulation.cc' || echo '$(srcdir)/'`$(SOURCE_DIR)/parallel/MeshManipulation.cc; \ @am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/libamdis_la-MeshManipulation.Tpo" "$(DEPDIR)/libamdis_la-MeshManipulation.Plo"; else rm -f "$(DEPDIR)/libamdis_la-MeshManipulation.Tpo"; exit 1; fi diff --git a/AMDiS/libtool b/AMDiS/libtool index 6a7f3c76..ace48e58 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 p1q024: # 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,13 +82,13 @@ 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 @@ -97,7 +97,7 @@ with_gcc=yes 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" @@ -171,7 +171,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" @@ -325,10 +325,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=" /u/witkowski/local/lib/i386-redhat-linux/4.1.2/ /u/witkowski/local/lib/ /u/witkowski/local/intel/mkl/10.0.1.014/lib/32/i386-redhat-linux/4.1.2/ /u/witkowski/local/intel/mkl/10.0.1.014/lib/32/ /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/" +sys_lib_search_path_spec=" /fastfs/wir/local/lib/x86_64-suse-linux/4.1.2/ /fastfs/wir/local/lib/../lib64/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/ /usr/lib/gcc/x86_64-suse-linux/4.1.2/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../x86_64-suse-linux/lib/x86_64-suse-linux/4.1.2/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../x86_64-suse-linux/lib/../lib64/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../x86_64-suse-linux/4.1.2/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../lib64/ /lib/x86_64-suse-linux/4.1.2/ /lib/../lib64/ /usr/lib/x86_64-suse-linux/4.1.2/ /usr/lib/../lib64/ /fastfs/wir/local/lib/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../x86_64-suse-linux/lib/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../ /lib/ /usr/lib/" # Run-time system search path for libraries -sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/mysql /usr/lib/octave-2.9.9 /usr/lib/qt-3.3/lib /usr/lib/qt4/lib /usr/lib/xulrunner-1.9.2 " +sys_lib_dlsearch_path_spec="/lib /usr/lib /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="" @@ -6760,7 +6760,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 p1q024: # Shell to use when invoking shell scripts. SHELL="/bin/sh" @@ -6782,12 +6782,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. @@ -6798,13 +6798,13 @@ 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/mpicxx" # Is the compiler the GNU C compiler? with_gcc=yes @@ -6813,7 +6813,7 @@ with_gcc=yes 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" @@ -6887,7 +6887,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" @@ -6942,11 +6942,11 @@ striplib="strip --strip-unneeded" # Dependencies to place before the objects being linked to create a # shared library. -predep_objects="/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crti.o /usr/lib/gcc/i386-redhat-linux/4.1.2/crtbeginS.o" +predep_objects="/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" # Dependencies to place after the objects being linked to create a # shared library. -postdep_objects="/usr/lib/gcc/i386-redhat-linux/4.1.2/crtendS.o /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crtn.o" +postdep_objects="/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" # Dependencies to place before the objects being linked to create a # shared library. @@ -6954,11 +6954,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="-L/u/witkowski/local/lib -L/u/witkowski/local/intel/mkl/10.0.1.014/lib/32 -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/../../.." +compiler_lib_search_path="-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/fastfs/wir/local/lib -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/../../.." # Method to check whether dependent libraries are shared objects. deplibs_check_method="pass_all" @@ -7038,10 +7038,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=" /u/witkowski/local/lib/i386-redhat-linux/4.1.2/ /u/witkowski/local/lib/ /u/witkowski/local/intel/mkl/10.0.1.014/lib/32/i386-redhat-linux/4.1.2/ /u/witkowski/local/intel/mkl/10.0.1.014/lib/32/ /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/" +sys_lib_search_path_spec=" /fastfs/wir/local/lib/x86_64-suse-linux/4.1.2/ /fastfs/wir/local/lib/../lib64/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/ /usr/lib/gcc/x86_64-suse-linux/4.1.2/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../x86_64-suse-linux/lib/x86_64-suse-linux/4.1.2/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../x86_64-suse-linux/lib/../lib64/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../x86_64-suse-linux/4.1.2/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../lib64/ /lib/x86_64-suse-linux/4.1.2/ /lib/../lib64/ /usr/lib/x86_64-suse-linux/4.1.2/ /usr/lib/../lib64/ /fastfs/wir/local/lib/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../../x86_64-suse-linux/lib/ /usr/lib64/gcc/x86_64-suse-linux/4.1.2/../../../ /lib/ /usr/lib/" # Run-time system search path for libraries -sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/mysql /usr/lib/octave-2.9.9 /usr/lib/qt-3.3/lib /usr/lib/qt4/lib /usr/lib/xulrunner-1.9.2 " +sys_lib_dlsearch_path_spec="/lib /usr/lib /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="" @@ -7065,7 +7065,7 @@ include_expsyms="" # ### BEGIN LIBTOOL TAG CONFIG: F77 -# Libtool was configured on host NWRW15: +# Libtool was configured on host p1q024: # Shell to use when invoking shell scripts. SHELL="/bin/sh" @@ -7087,12 +7087,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. @@ -7103,7 +7103,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" @@ -7112,13 +7112,13 @@ LTCFLAGS="-g -O2" CC="g77" # Is the compiler the GNU C compiler? -with_gcc=yes +with_gcc= # 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" @@ -7346,10 +7346,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=" /u/witkowski/local/lib/i386-redhat-linux/3.4.6/ /u/witkowski/local/lib/ /u/witkowski/local/intel/mkl/10.0.1.014/lib/32/i386-redhat-linux/3.4.6/ /u/witkowski/local/intel/mkl/10.0.1.014/lib/32/ /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/" +sys_lib_search_path_spec=" /fastfs/wir/local/lib/x86_64-suse-linux/3.3.5/ /fastfs/wir/local/lib/ /usr/lib64/gcc-lib/x86_64-suse-linux/3.3.5/ /usr/lib/gcc/x86_64-suse-linux/3.3.5/ /usr/lib64/gcc-lib/x86_64-suse-linux/3.3.5/../../../../x86_64-suse-linux/lib/x86_64-suse-linux/3.3.5/ /usr/lib64/gcc-lib/x86_64-suse-linux/3.3.5/../../../../x86_64-suse-linux/lib/ /usr/lib64/gcc-lib/x86_64-suse-linux/3.3.5/../../../x86_64-suse-linux/3.3.5/ /usr/lib64/gcc-lib/x86_64-suse-linux/3.3.5/../../../ /lib/x86_64-suse-linux/3.3.5/ /lib/ /usr/lib/x86_64-suse-linux/3.3.5/ /usr/lib/" # Run-time system search path for libraries -sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/mysql /usr/lib/octave-2.9.9 /usr/lib/qt-3.3/lib /usr/lib/qt4/lib /usr/lib/xulrunner-1.9.2 " +sys_lib_dlsearch_path_spec="/lib /usr/lib /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/Serializer.h b/AMDiS/src/Serializer.h index 4ef1a772..dbc0f30a 100644 --- a/AMDiS/src/Serializer.h +++ b/AMDiS/src/Serializer.h @@ -81,6 +81,9 @@ namespace AMDiS { { FUNCNAME("Serializer::writeFiles()"); + TEST_EXIT(tsModulo > 0) + ("Parameter 'write every ith timestep' must be larger than zero!\n"); + timestepNumber++; timestepNumber %= tsModulo; if ((timestepNumber != 0) && !force) diff --git a/AMDiS/src/parallel/MeshDistributor.cc b/AMDiS/src/parallel/MeshDistributor.cc index 9c64ffde..3afa0c58 100644 --- a/AMDiS/src/parallel/MeshDistributor.cc +++ b/AMDiS/src/parallel/MeshDistributor.cc @@ -22,6 +22,7 @@ #include "parallel/MeshManipulation.h" #include "parallel/ParallelDebug.h" #include "parallel/StdMpi.h" +#include "parallel/MeshPartitioner.h" #include "parallel/ParMetisPartitioner.h" #include "parallel/MpiHelper.h" #include "io/ElementFileWriter.h" @@ -148,12 +149,12 @@ namespace AMDiS { setInitialElementWeights(); // and now partition the mesh - partitioner->fillCoarsePartitionVec(&oldPartitionVec); + partitioner->getPartitionMap(oldPartitionMap); bool partitioningSucceed = partitioner->partition(elemWeights, INITIAL); TEST_EXIT(partitioningSucceed)("Initial partitioning does not work!\n"); - partitioner->fillCoarsePartitionVec(&partitionVec); + partitioner->getPartitionMap(partitionMap); #if (DEBUG != 0) @@ -928,13 +929,12 @@ namespace AMDiS { // === Run ParMETiS to calculate a new mesh partitioning. === partitioner->useLocalGlobalDofMap(&mapLocalGlobalDofs); - bool partitioningSucceed = - partitioner->partition(elemWeights, ADAPTIVE_REPART, 1000.0); + bool partitioningSucceed = partitioner->partition(elemWeights, ADAPTIVE_REPART); if (!partitioningSucceed) { MSG("ParMETIS created empty partition!\n"); return; } - oldPartitionVec = partitionVec; + oldPartitionMap = partitionMap; // === Create map that maps macro element indices to pointers to the === @@ -1112,93 +1112,13 @@ namespace AMDiS { MeshManipulation meshManipulation(feSpace); meshManipulation.deleteDoubleDofs(newMacroEl, elObjects); -#if 0 - { - TraverseStack stack; - ElInfo *elInfo = stack.traverseFirst(mesh, 0, Mesh::CALL_EL_LEVEL); - while (elInfo) { - MSG("HAVE MACRO EL %d\n", elInfo->getMacroElement()->getIndex()); - - elInfo = stack.traverseNext(elInfo); - } - } - - { - TraverseStack stack; - ElInfo *elInfo = stack.traverseFirst(mesh, -1, Mesh::CALL_LEAF_EL); - while (elInfo) { - MSG("A-CHECK DOFs ON %d: %d %d %d %d\n", - elInfo->getElement()->getIndex(), - elInfo->getElement()->getDof(0, 0), - elInfo->getElement()->getDof(1, 0), - elInfo->getElement()->getDof(2, 0), - elInfo->getElement()->getDof(3, 0)); - - elInfo = stack.traverseNext(elInfo); - } - } -#endif - mesh->dofCompress(); - partitioner->fillCoarsePartitionVec(&partitionVec); - -#if 0 - { - TraverseStack stack; - ElInfo *elInfo = stack.traverseFirst(mesh, -1, Mesh::CALL_LEAF_EL); - while (elInfo) { - MSG("B-CHECK DOFs ON %d: %d %d %d %d\n", - elInfo->getElement()->getIndex(), - elInfo->getElement()->getDof(0, 0), - elInfo->getElement()->getDof(1, 0), - elInfo->getElement()->getDof(2, 0), - elInfo->getElement()->getDof(3, 0)); - - elInfo = stack.traverseNext(elInfo); - } - } -#endif + partitioner->getPartitionMap(partitionMap); updateInteriorBoundaryInfo(); -#if 0 - { - TraverseStack stack; - ElInfo *elInfo = stack.traverseFirst(mesh, -1, Mesh::CALL_LEAF_EL); - while (elInfo) { - MSG("C-CHECK DOFs ON %d: %d %d %d %d\n", - elInfo->getElement()->getIndex(), - elInfo->getElement()->getDof(0, 0), - elInfo->getElement()->getDof(1, 0), - elInfo->getElement()->getDof(2, 0), - elInfo->getElement()->getDof(3, 0)); - - elInfo = stack.traverseNext(elInfo); - } - } -#endif - updateLocalGlobalNumbering(); -#if 0 - { - TraverseStack stack; - ElInfo *elInfo = stack.traverseFirst(mesh, -1, Mesh::CALL_LEAF_EL); - while (elInfo) { - MSG("D-CHECK DOFs ON %d: %d %d %d %d\n", - elInfo->getElement()->getIndex(), - elInfo->getElement()->getDof(0, 0), - elInfo->getElement()->getDof(1, 0), - elInfo->getElement()->getDof(2, 0), - elInfo->getElement()->getDof(3, 0)); - - elInfo = stack.traverseNext(elInfo); - } - } -#endif - - - #if (DEBUG != 0) MSG("AMDiS runs in debug mode, so make some test ...\n"); @@ -1229,7 +1149,7 @@ namespace AMDiS { { FUNCNAME("MeshDistributor::updateInteriorBoundaryInfo()"); - elObjects.createRankData(partitionVec); + elObjects.createRankData(partitionMap); createBoundaryData(); #if (DEBUG != 0) @@ -1270,7 +1190,7 @@ namespace AMDiS { // === Create mesh element data for this rank. === - elObjects.createRankData(partitionVec); + elObjects.createRankData(partitionMap); } @@ -1996,8 +1916,8 @@ namespace AMDiS { partitioner->serialize(out); SerUtil::serialize(out, elemWeights); - SerUtil::serialize(out, partitionVec); - SerUtil::serialize(out, oldPartitionVec); + SerUtil::serialize(out, partitionMap); + SerUtil::serialize(out, oldPartitionMap); SerUtil::serialize(out, nRankDofs); SerUtil::serialize(out, nOverallDofs); @@ -2037,8 +1957,8 @@ namespace AMDiS { partitioner->deserialize(in); SerUtil::deserialize(in, elemWeights); - SerUtil::deserialize(in, partitionVec); - SerUtil::deserialize(in, oldPartitionVec); + SerUtil::deserialize(in, partitionMap); + SerUtil::deserialize(in, oldPartitionMap); SerUtil::deserialize(in, nRankDofs); SerUtil::deserialize(in, nOverallDofs); diff --git a/AMDiS/src/parallel/MeshDistributor.h b/AMDiS/src/parallel/MeshDistributor.h index 6bf1eba4..1e760b56 100644 --- a/AMDiS/src/parallel/MeshDistributor.h +++ b/AMDiS/src/parallel/MeshDistributor.h @@ -29,6 +29,7 @@ #include <vector> #include <mpi.h> +#include "parallel/MeshPartitioner.h" #include "parallel/InteriorBoundary.h" #include "Global.h" #include "ProblemTimeInterface.h" @@ -43,8 +44,6 @@ namespace AMDiS { using namespace std; - class ParMetisPartitioner; - class MeshDistributor { protected: @@ -437,8 +436,8 @@ namespace AMDiS { /// Info level. int info; - /// Pointer to the paritioner which is used to devide a mesh into partitions. - ParMetisPartitioner *partitioner; + /// Pointer to a mesh partitioner that is used to partition the mesh to the ranks. + MeshPartitioner *partitioner; /// Weights for the elements, i.e., the number of leaf elements within this element. map<int, double> elemWeights; @@ -447,13 +446,13 @@ namespace AMDiS { * Stores to every macro element index the number of the rank that owns this * macro element. */ - map<int, int> partitionVec; + map<int, int> partitionMap; /** \brief * Stores an old partitioning of elements. To every macro element index the * number of the rank it corresponds to is stored. */ - map<int, int> oldPartitionVec; + map<int, int> oldPartitionMap; /// Number of DOFs in the rank mesh. int nRankDofs; diff --git a/AMDiS/src/parallel/MeshPartitioner.cc b/AMDiS/src/parallel/MeshPartitioner.cc new file mode 100644 index 00000000..77115afa --- /dev/null +++ b/AMDiS/src/parallel/MeshPartitioner.cc @@ -0,0 +1,62 @@ +// +// Software License for AMDiS +// +// Copyright (c) 2010 Dresden University of Technology +// All rights reserved. +// Authors: Simon Vey, Thomas Witkowski et al. +// +// This file is part of AMDiS +// +// See also license.opensource.txt in the distribution. + + +#include "parallel/MeshPartitioner.h" +#include "Mesh.h" +#include "Traverse.h" +#include "Serializer.h" + +namespace AMDiS { + + void MeshPartitioner::createInitialPartitioning() + { + FUNCNAME("MeshPartitioner::createInitialPartitioning()"); + + int mpiRank = mpiComm->Get_rank(); + int mpiSize = mpiComm->Get_size(); + int nLeaves = mesh->getNumberOfLeaves(); + int elPerRank = nLeaves / mpiSize; + + // === Create initial partitioning of the AMDiS mesh. === + + elementInRank.clear(); + + TraverseStack stack; + ElInfo *elInfo = stack.traverseFirst(mesh, 0, Mesh::CALL_EL_LEVEL); + while (elInfo) { + Element *element = elInfo->getElement(); + + if ((element->getIndex() >= mpiRank * elPerRank && + element->getIndex() < (mpiRank + 1) * elPerRank) || + (element->getIndex() >= mpiSize * elPerRank && + mpiRank == mpiSize - 1)) + elementInRank[element->getIndex()] = true; + else + elementInRank[element->getIndex()] = false; + + elInfo = stack.traverseNext(elInfo); + } + } + + + void MeshPartitioner::serialize(std::ostream &out) + { + SerUtil::serialize(out, elementInRank); + } + + + void MeshPartitioner::deserialize(std::istream &in) + { + SerUtil::deserialize(in, elementInRank); + } + +} diff --git a/AMDiS/src/parallel/MeshPartitioner.h b/AMDiS/src/parallel/MeshPartitioner.h new file mode 100644 index 00000000..a288062c --- /dev/null +++ b/AMDiS/src/parallel/MeshPartitioner.h @@ -0,0 +1,109 @@ +// ============================================================================ +// == == +// == AMDiS - Adaptive multidimensional simulations == +// == == +// == http://www.amdis-fem.org == +// == == +// ============================================================================ +// +// Software License for AMDiS +// +// Copyright (c) 2010 Dresden University of Technology +// All rights reserved. +// Authors: Simon Vey, Thomas Witkowski et al. +// +// This file is part of AMDiS +// +// See also license.opensource.txt in the distribution. + + + +/** \file MeshPartitioner.h */ + +#ifndef AMDIS_MESH_PARTITIONER_H +#define AMDIS_MESH_PARTITIONER_H + +#include <map> +#include "AMDiS_fwd.h" +#include "Mesh.h" + +namespace AMDiS { + + + using namespace std; + + + enum PartitionMode { + INITIAL = 0, // initial partitioning of a unpartitioned mesh + ADAPTIVE_REPART = 1, // repartitioning of a adaptively refined mesh + REFINE_PART = 2 // quality improvement of the current partitioning + }; + + + + class MeshPartitioner + { + public: + MeshPartitioner(MPI::Intracomm *comm) + : mpiComm(comm), + mesh(NULL), + mapLocalGlobal(NULL) + {} + + virtual ~MeshPartitioner() {} + + /// Creates an initial paritioning of the AMDiS mesh. + void createInitialPartitioning(); + + virtual bool partition(map<int, double> &elemWeights, + PartitionMode mode = INITIAL) = 0; + + /// Creates a map which stores for each element the rank that owns this element. + virtual void getPartitionMap(map<int, int> &partitionMap) = 0; + + /// Write partitioner state to disk. + void serialize(ostream &out); + + /// Read partitioner state from disk. + void deserialize(istream &in); + + void setMesh(Mesh *m) + { + mesh = m; + } + + void useLocalGlobalDofMap(map<DegreeOfFreedom, DegreeOfFreedom> *m) + { + mapLocalGlobal = m; + } + + map<int, bool>& getElementInRank() + { + return elementInRank; + } + + map<int, vector<int> >& getRecvElements() + { + return recvElements; + } + + map<int, vector<int> >& getSendElements() + { + return sendElements; + } + + protected: + MPI::Intracomm *mpiComm; + + Mesh *mesh; + + map<DegreeOfFreedom, DegreeOfFreedom> *mapLocalGlobal; + + /// Maps to each macro element index if it is in rank's partition or not. + map<int, bool> elementInRank; + + map<int, vector<int> > recvElements, sendElements; + }; +} + +#endif diff --git a/AMDiS/src/parallel/ParMetisPartitioner.cc b/AMDiS/src/parallel/ParMetisPartitioner.cc index f8d4dfd3..c59a85fe 100644 --- a/AMDiS/src/parallel/ParMetisPartitioner.cc +++ b/AMDiS/src/parallel/ParMetisPartitioner.cc @@ -222,40 +222,8 @@ namespace AMDiS { } - void ParMetisPartitioner::createInitialPartitioning() - { - FUNCNAME("ParMetrisPartitioner::createInitialPartitioning()"); - - int mpiRank = mpiComm->Get_rank(); - int mpiSize = mpiComm->Get_size(); - int nLeaves = mesh->getNumberOfLeaves(); - int elPerRank = nLeaves / mpiSize; - - // === Create initial partitioning of the AMDiS mesh. === - - elementInRank.clear(); - - TraverseStack stack; - ElInfo *elInfo = stack.traverseFirst(mesh, 0, Mesh::CALL_EL_LEVEL); - while (elInfo) { - Element *element = elInfo->getElement(); - - if ((element->getIndex() >= mpiRank * elPerRank && - element->getIndex() < (mpiRank + 1) * elPerRank) || - (element->getIndex() >= mpiSize * elPerRank && - mpiRank == mpiSize - 1)) - elementInRank[element->getIndex()] = true; - else - elementInRank[element->getIndex()] = false; - - elInfo = stack.traverseNext(elInfo); - } - } - - bool ParMetisPartitioner::partition(std::map<int, double> &elemWeights, - PartitionMode mode, - float itr) + PartitionMode mode) { FUNCNAME("ParMetisPartitioner::partition()"); @@ -403,8 +371,6 @@ namespace AMDiS { break; case ADAPTIVE_REPART: { - // parMetisGraph.print(); - std::vector<int> vsize(nElements); for (int i = 0; i < nElements; i++) vsize[i] = static_cast<int>(floatWgts[i]); @@ -453,72 +419,15 @@ namespace AMDiS { // === Distribute new partition data. === - bool b = distributePartitioning(&(part[0])); - - if (!b) { - MSG("RETRY ParMETIS!\n"); - - std::vector<float> testub(14); - - testub[0] = 1.001; - testub[1] = 1.01; - testub[2] = 1.02; - testub[3] = 1.03; - testub[4] = 1.04; - testub[5] = 1.06; - testub[6] = 1.07; - testub[7] = 1.08; - testub[8] = 1.09; - testub[9] = 1.1; - testub[10] = 1.25; - testub[11] = 1.5; - testub[12] = 2.0; - testub[13] = 2.5; - - for (int jj = 0; jj < testub.size(); jj++) { - ubvec = testub[jj]; - - std::vector<int> vsize(nElements); - for (int i = 0; i < nElements; i++) - vsize[i] = static_cast<int>(floatWgts[i]); - - - ParMETIS_V3_AdaptiveRepart(parMetisMesh->getElementDist(), - parMetisGraph.getXAdj(), - parMetisGraph.getAdjncy(), - &(wgts[0]), - NULL, - &(vsize[0]), - &wgtflag, - &numflag, - &ncon, - &nparts, - &(tpwgts[0]), - &ubvec, - &itr, - options, - &edgecut, - &(part[0]), - &tmpComm); - - - b = distributePartitioning(&(part[0])); - - MSG("ParMETIS RETRY with %f: %d\n", ubvec, b); - } - } - - return b; + return distributePartitioning(&(part[0])); } - void ParMetisPartitioner::fillCoarsePartitionVec(std::map<int, int> *partitionVec) + void ParMetisPartitioner::getPartitionMap(std::map<int, int> &partitionMap) { - FUNCNAME("ParMetisPartitioner::fillCoarsePartitionVec()"); - - TEST_EXIT_DBG(partitionVec)("No partition vector!\n"); + FUNCNAME("ParMetisPartitioner::getPartitionMap()"); - partitionVec->clear(); + partitionMap.clear(); // update ParMETIS mesh to new partitioning if (!parMetisMesh) @@ -551,7 +460,7 @@ namespace AMDiS { // fill partitionVec for (int i = 0; i < mpiSize; i++) for (int j = 0; j < nPartitionElements[i]; j++) - (*partitionVec)[partitionElements[elmdist[i] + j]] = i; + partitionMap[partitionElements[elmdist[i] + j]] = i; } @@ -660,16 +569,5 @@ namespace AMDiS { return true; } - - - void ParMetisPartitioner::serialize(std::ostream &out) - { - SerUtil::serialize(out, elementInRank); - } - - - void ParMetisPartitioner::deserialize(std::istream &in) - { - SerUtil::deserialize(in, elementInRank); - } + } diff --git a/AMDiS/src/parallel/ParMetisPartitioner.h b/AMDiS/src/parallel/ParMetisPartitioner.h index a96974fd..3b11c09a 100644 --- a/AMDiS/src/parallel/ParMetisPartitioner.h +++ b/AMDiS/src/parallel/ParMetisPartitioner.h @@ -25,30 +25,24 @@ #include <map> #include <set> -#include "parmetis.h" +#include "AMDiS_fwd.h" #include "Global.h" +#include "parallel/MeshPartitioner.h" +#include "parmetis.h" #include "mpi.h" namespace AMDiS { - class FiniteElemSpace; - - enum PartitionMode { - INITIAL = 0, // initial partitioning of a unpartitioned mesh - ADAPTIVE_REPART = 1, // repartitioning of a adaptively refined mesh - REFINE_PART = 2 // quality improvement of the current partitioning - }; + using namespace std; class ParMetisGraph; - class Mesh; - template<typename T > class DOFVector; class ParMetisMesh { public: ParMetisMesh(Mesh *mesh, MPI::Intracomm *comm, - std::map<int, bool>& elementInRank, - std::map<DegreeOfFreedom, DegreeOfFreedom> *mapLocalGlobal); + map<int, bool>& elementInRank, + map<DegreeOfFreedom, DegreeOfFreedom> *mapLocalGlobal); ~ParMetisMesh(); @@ -130,7 +124,7 @@ namespace AMDiS { int nElements; - std::map<int, int> elem_a2p; + map<int, int> elem_a2p; int *elem_p2a; @@ -169,80 +163,37 @@ namespace AMDiS { }; - class ParMetisPartitioner + class ParMetisPartitioner : public MeshPartitioner { public: ParMetisPartitioner(MPI::Intracomm *comm) - : mpiComm(comm), - mesh(NULL), + : MeshPartitioner(comm), parMetisMesh(NULL), - mapLocalGlobal(NULL) + itr(1000.0) {} ~ParMetisPartitioner(); - void setMesh(Mesh *m) - { - mesh = m; - } + bool partition(map<int, double> &elemWeights, + PartitionMode mode = INITIAL); - bool partition(std::map<int, double> &elemWeights, - PartitionMode mode = INITIAL, - float itr = 1000000.0); + /// Creates a map which stores for each element the rank that owns this element. + void getPartitionMap(map<int, int> &partitionMap); - /* \brief - * Creates a map which stores for each element on partitioning level the - * rank the element corresponds to. - */ - void fillCoarsePartitionVec(std::map<int, int> *partitionVec); - - /// Creates an initial paritioning of the AMDiS mesh. - void createInitialPartitioning(); - - void useLocalGlobalDofMap(std::map<DegreeOfFreedom, DegreeOfFreedom> *m) - { - mapLocalGlobal = m; - } - - std::map<int, bool>& getElementInRank() + void setItr(float value) { - return elementInRank; + itr = value; } - std::map<int, std::vector<int> >& getRecvElements() - { - return recvElements; - } - - std::map<int, std::vector<int> >& getSendElements() - { - return sendElements; - } - - /// Write partitioner state to disk. - void serialize(std::ostream &out); - - /// Read partitioner state from disk. - void deserialize(std::istream &in); - protected: // Returns true, if the mesh partitioning could be distributed. If this is not the // case, i.e., because there are empty partitions, the function returns false. bool distributePartitioning(int *part); protected: - MPI::Intracomm *mpiComm; - - Mesh *mesh; - ParMetisMesh *parMetisMesh; - std::map<DegreeOfFreedom, DegreeOfFreedom> *mapLocalGlobal; - - /// Maps to each macro element index if it is in rank's partition or not. - std::map<int, bool> elementInRank; - - std::map<int, std::vector<int> > recvElements, sendElements; + float itr; }; } diff --git a/AMDiS/src/parallel/ParallelDebug.cc b/AMDiS/src/parallel/ParallelDebug.cc index 6e130c7f..c93e0074 100644 --- a/AMDiS/src/parallel/ParallelDebug.cc +++ b/AMDiS/src/parallel/ParallelDebug.cc @@ -819,7 +819,7 @@ namespace AMDiS { while (elInfo) { int index = elInfo->getElement()->getIndex(); - vec[index] = pdb.partitionVec[index]; + vec[index] = pdb.partitionMap[index]; elInfo = stack.traverseNext(elInfo); } -- GitLab