diff --git a/AMDiS/AMDISConfig.cmake.in b/AMDiS/AMDISConfig.cmake.in index b7cd1b36b5adb780e74fd434d5a8e6a4d73e0c56..34e34e6ed2f5757e5eb0ff54d025715e62145576 100644 --- a/AMDiS/AMDISConfig.cmake.in +++ b/AMDiS/AMDISConfig.cmake.in @@ -69,63 +69,36 @@ set(AMDIS_MAJOR_VERSION @AMDIS_MAJOR@) set(AMDIS_MINOR_VERSION @AMDIS_MINOR@) if(AMDIS_NEED_UMFPACK) - #look for umfpack, we need the headers only - find_file(UMFPACK_H umfpack.h - HINTS /usr/include /usr/include/suitesparse /usr/include/ufsparse - DOC "headerfile umfpack.h for UMFPACK") - if( UMFPACK_H ) - #construct the include path - get_filename_component(UMFPACK_PATH ${UMFPACK_H} PATH) - #look for ufconfig - find_file(UFCONFIG_H UFconfig.h - HINTS /usr/include ${UMFPACK_PATH} - DOC "headerfile UFConfig.h") - if( UFCONFIG_H ) - get_filename_component(UFCONFIG_PATH ${UFCONFIG_H} PATH) - else() - message(FATAL_ERROR "could not find UFConfig.h, needed for umfpack") - endif() - #look for amd - find_file(AMD_H amd.h - HINTS /usr/include/ ${UMFPACK_PATH} - DOC "headerfile amd.h") - if( AMD_H ) - get_filename_component(AMD_PATH ${AMD_H} PATH) - else() - message( FATAL_ERROR "could not find amd.h, needed for umfpack") - endif() - - #add the compileflags and directories - list(APPEND AMDIS_INCLUDE_DIRS ${UMFPACK_PATH} ${UFCONFIG_PATH} ${AMD_PATH}) - else() - message(FATAL_ERROR "Could not find the umfpack-headers. Please install umfpack") - endif() - find_library(BLAS_LIBRARY NAMES "blas" "goto" - DOC "the blas library") -# message("blaslibrary: ${BLAS_LIBRARY}") - if( BLAS_LIBRARY ) - list(APPEND AMDIS_LIBRARIES ${BLAS_LIBRARY}) - else() - message(ERROR " could not find the blas library. please set the variable BLAS_LIBRARY to the blas library with full path") - endif() + set(AMDIS_UMFPACK_PATH @UMFPACK_PATH@) + list(APPEND AMDIS_INCLUDE_DIRS ${AMDIS_UMFPACK_PATH}) find_library(UMFPACK_LIB umfpack - DOC "the UMFPACK library") - if( UMFPACK_LIB ) + HINTS ENV LIBRARY_PATH + DOC "The UMFPACK library") + if(UMFPACK_LIB) list(APPEND AMDIS_LIBRARIES ${UMFPACK_LIB}) else() - message(FATAL_ERROR "Did not find the umfpack library") + message(FATAL_ERROR "Could not find the UMFPACK library") endif() + find_library(BLAS_LIBRARY NAMES "blas" "goto" "mkl" + HINTS ENV MKL_LIB + DOC "The BLAS library") + if(BLAS_LIBRARY) + list(APPEND AMDIS_LIBRARIES ${BLAS_LIBRARY}) + list(APPEND AMDIS_LIBRARY_DIRS ${BLAS_LIBRARY_DIR}) + else() + message(ERROR "Could not find the BLAS library. Please set the variable BLAS_LIBRARY to the blas library with full path") + endif() + find_library(AMD_LIB amd - DOC "the AMD library") - if( AMD_LIB ) + HINTS ENV LIBRARY_PATH + DOC "The AMD library") + if(AMD_LIB) list(APPEND AMDIS_LIBRARIES ${AMD_LIB}) else() - message(FATAL_ERROR "Did not find the amd library") + message(FATAL_ERROR "Could not find the AMD library.") endif() - #message("amdis-libs: ${AMDIS_LIBRARIES}") - list(APPEND AMDIS_LIBRARY_DIRS ${BLAS_LIBRARY_DIR}) endif(AMDIS_NEED_UMFPACK) @@ -135,13 +108,20 @@ list(APPEND AMDIS_INCLUDE_DIRS ${AMDIS_INCLUDE_DIR}/compositeFEM) list(APPEND AMDIS_INCLUDE_DIRS ${AMDIS_INCLUDE_DIR}/muparser) if(${AMDIS_FIND_COMPONENTS} MATCHES umfpack ) - if( NOT AMDIS_NEED_UMFPACK ) - set( AMDIS_umfpack_FOUND FALSE) - message(SEND_ERROR "the selected amdis was not compiled with umfpack") + if(NOT AMDIS_NEED_UMFPACK) + set(AMDIS_umfpack_FOUND FALSE) + message(SEND_ERROR "The selected amdis was not compiled with umfpack") endif() endif() if(AMDIS_NEED_ZOLTAN) - find_library(ZOLTAN_LIB zoltan DOC "full path to the zoltan library") - list(APPEND AMDIS_LIBRARIES ${ZOLTAN_LIB}) + find_library(ZOLTAN_LIB zoltan + HINTS ENV LIBRARY_PATH + DOC "full path to the zoltan library") + + if(ZOLTAN_LIB) + list(APPEND AMDIS_LIBRARIES ${ZOLTAN_LIB}) + else() + message(FATAL_ERROR "Could not find zoltan library!") + endif() endif() diff --git a/AMDiS/CMakeLists.txt b/AMDiS/CMakeLists.txt index 2987385179a44bb9885b0abc494cfd2633f541af..a238f467a810d9cf12c19acad45187d73598536d 100644 --- a/AMDiS/CMakeLists.txt +++ b/AMDiS/CMakeLists.txt @@ -246,8 +246,7 @@ endif(ENABLE_PARALLEL_DOMAIN) if(ENABLE_UMFPACK) find_file(UMFPACK_H umfpack.h - PATH ENV CPATH - HINTS /usr/include /usr/include/suitesparse /usr/include/ufsparse + HINTS ENV CPATH /usr/include /usr/include/suitesparse /usr/include/ufsparse DOC "headerfile umfpack.h for UMFPACK") if(UMFPACK_H) get_filename_component(UMFPACK_PATH ${UMFPACK_H} PATH) diff --git a/AMDiS/src/AdaptInstationary.cc b/AMDiS/src/AdaptInstationary.cc index b2201e45ac894a71ce16707b43bf38d574665d5d..b1c16f3c9461367f33933df51bcf126e391ab435 100644 --- a/AMDiS/src/AdaptInstationary.cc +++ b/AMDiS/src/AdaptInstationary.cc @@ -342,11 +342,6 @@ namespace AMDiS { } } -#ifdef HAVE_PARALLEL_DOMAIN_AMDIS - MeshDistributor::globalMeshDistributor->exitParallelization(); - PetscFinalize(); -#endif - return errorCode; } diff --git a/AMDiS/src/AdaptStationary.cc b/AMDiS/src/AdaptStationary.cc index 964babed0fd76770492846d734c16f58eda7259a..d02b92688427a5be77c08f6c3de070143d4b1e00 100644 --- a/AMDiS/src/AdaptStationary.cc +++ b/AMDiS/src/AdaptStationary.cc @@ -77,11 +77,6 @@ namespace AMDiS { adaptInfo->incSpaceIteration(); } -#ifdef HAVE_PARALLEL_DOMAIN_AMDIS - MeshDistributor::globalMeshDistributor->exitParallelization(); - PetscFinalize(); -#endif - return 0; } diff --git a/AMDiS/src/DOFVector.cc b/AMDiS/src/DOFVector.cc index 4e68d3a76bb3221f552845a258b79c4431df18e9..001cf56c0923d14918bb5ad1a0d7d5af43f3fd44 100644 --- a/AMDiS/src/DOFVector.cc +++ b/AMDiS/src/DOFVector.cc @@ -897,6 +897,11 @@ namespace AMDiS { elInfo = stack.traverseNext(elInfo); } +#ifdef HAVE_PARALLEL_DOMAIN_AMDIS + double localValue = value; + MPI::COMM_WORLD.Allreduce(&localValue, &value, 1, MPI_DOUBLE, MPI_SUM); +#endif + return value; } @@ -939,6 +944,11 @@ namespace AMDiS { cont = dualTraverse.traverseNext(dualElInfo); } +#ifdef HAVE_PARALLEL_DOMAIN_AMDIS + double localValue = value; + MPI::COMM_WORLD.Allreduce(&localValue, &value, 1, MPI_DOUBLE, MPI_SUM); +#endif + return value; } @@ -979,6 +989,11 @@ namespace AMDiS { elInfo = stack.traverseNext(elInfo); } +#ifdef HAVE_PARALLEL_DOMAIN_AMDIS + double localValue = value; + MPI::COMM_WORLD.Allreduce(&localValue, &value, 1, MPI_DOUBLE, MPI_SUM); +#endif + return value; } @@ -1014,6 +1029,11 @@ namespace AMDiS { elInfo = stack.traverseNext(elInfo); } +#ifdef HAVE_PARALLEL_DOMAIN_AMDIS + double localValue = value; + MPI::COMM_WORLD.Allreduce(&localValue, &value, 1, MPI_DOUBLE, MPI_SUM); +#endif + return value; } } diff --git a/AMDiS/src/DOFVector.hh b/AMDiS/src/DOFVector.hh index d7ce38ff09e645a3248913b9717a43daffc13b8f..6f202d73e486170c577df6516b454c6698235cc5 100644 --- a/AMDiS/src/DOFVector.hh +++ b/AMDiS/src/DOFVector.hh @@ -171,9 +171,15 @@ namespace AMDiS { for (vecIterator.reset(); !vecIterator.end(); ++vecIterator) nrm += (*vecIterator) * (*vecIterator); - return(sqrt(nrm)); +#ifdef HAVE_PARALLEL_DOMAIN_AMDIS + double localNrm = nrm; + MPI::COMM_WORLD.Allreduce(&localNrm, &nrm, 1, MPI_DOUBLE, MPI_SUM); +#endif + + return sqrt(nrm); } + template<typename T> double DOFVector<T>::squareNrm2() const { @@ -187,9 +193,15 @@ namespace AMDiS { for (vecIterator.reset(); !vecIterator.end(); ++vecIterator) nrm += (*vecIterator) * (*vecIterator); +#ifdef HAVE_PARALLEL_DOMAIN_AMDIS + double localNrm = nrm; + MPI::COMM_WORLD.Allreduce(&localNrm, &nrm, 1, MPI_DOUBLE, MPI_SUM); +#endif + return nrm; } + template<typename T> T DOFVector<T>::asum() const { @@ -203,9 +215,15 @@ namespace AMDiS { for (vecIterator.reset(); !vecIterator.end(); ++vecIterator) nrm += abs(*vecIterator); - return(nrm); +#ifdef HAVE_PARALLEL_DOMAIN_AMDIS + double localNrm = nrm; + MPI::COMM_WORLD.Allreduce(&localNrm, &nrm, 1, MPI_DOUBLE, MPI_SUM); +#endif + + return nrm; } + template<typename T> T DOFVector<T>::sum() const { @@ -219,9 +237,15 @@ namespace AMDiS { for (vecIterator.reset(); !vecIterator.end(); ++vecIterator) nrm += *vecIterator; - return(nrm); +#ifdef HAVE_PARALLEL_DOMAIN_AMDIS + double localNrm = nrm; + MPI::COMM_WORLD.Allreduce(&localNrm, &nrm, 1, MPI_DOUBLE, MPI_SUM); +#endif + + return nrm; } + template<typename T> void DOFVector<T>::set(T alpha) { @@ -268,6 +292,11 @@ namespace AMDiS { for (vecIterator.reset(), m = *vecIterator; !vecIterator.end(); ++vecIterator) m = std::min(m, *vecIterator); +#ifdef HAVE_PARALLEL_DOMAIN_AMDIS + double localMin = m; + MPI::COMM_WORLD.Allreduce(&localMin, &m, 1, MPI_DOUBLE, MPI_MIN); +#endif + return m; } @@ -284,10 +313,15 @@ namespace AMDiS { for (vecIterator.reset(), m = *vecIterator; !vecIterator.end(); ++vecIterator) m = std::max(m, *vecIterator); - return m; +#ifdef HAVE_PARALLEL_DOMAIN_AMDIS + double localMax = m; + MPI::COMM_WORLD.Allreduce(&localMax, &m, 1, MPI_DOUBLE, MPI_MAX); +#endif + return m; } + template<typename T> T DOFVector<T>::absMax() const { @@ -310,6 +344,13 @@ namespace AMDiS { count++; } +#ifdef HAVE_PARALLEL_DOMAIN_AMDIS + double localSum = m; + int localCount = count; + MPI::COMM_WORLD.Allreduce(&localSum, &m, 1, MPI_DOUBLE, MPI_SUM); + MPI::COMM_WORLD.Allreduce(&localCount, &count, 1, MPI_INT, MPI_SUM); +#endif + return m / count; } @@ -365,6 +406,7 @@ namespace AMDiS { return; } + template<typename T> int DOFVector<T>::calcMemoryUsage() const { @@ -375,6 +417,7 @@ namespace AMDiS { return result; } + template<typename T> T DOFVectorBase<T>::evalUh(const DimVec<double>& lambda, DegreeOfFreedom* dof_indices) @@ -386,9 +429,15 @@ namespace AMDiS { for (int i = 0; i < nBasisFcts; i++) val += (*this)[dof_indices[i]]*(*phi->getPhi(i))(lambda); +#ifdef HAVE_PARALLEL_DOMAIN_AMDIS + double localVal = val; + MPI::COMM_WORLD.Allreduce(&localVal, &val, 1, MPI_DOUBLE, MPI_SUM); +#endif + return val; } + template<typename T> void DOFVector<T>::interpol(AbstractFunction<T, WorldVector<double> > *fct) { @@ -433,6 +482,7 @@ namespace AMDiS { } } + template<typename T> void DOFVector<T>::interpolFct(ElInfo* elinfo) { @@ -450,6 +500,7 @@ namespace AMDiS { (*traverseVector)[myLocalIndices[i]] = inter_val[i]; } + template<typename T> double DOFVector<T>::Int(Quadrature* q) const { @@ -483,7 +534,12 @@ namespace AMDiS { elInfo = stack.traverseNext(elInfo); } - return result; +#ifdef HAVE_PARALLEL_DOMAIN_AMDIS + double localResult = result; + MPI::COMM_WORLD.Allreduce(&localResult, &result, 1, MPI_DOUBLE, MPI_SUM); +#endif + + return result; } @@ -520,7 +576,12 @@ namespace AMDiS { elInfo = stack.traverseNext(elInfo); } - return result; +#ifdef HAVE_PARALLEL_DOMAIN_AMDIS + double localResult = result; + MPI::COMM_WORLD.Allreduce(&localResult, &result, 1, MPI_DOUBLE, MPI_SUM); +#endif + + return result; } @@ -557,7 +618,12 @@ namespace AMDiS { elInfo = stack.traverseNext(elInfo); } - return result; +#ifdef HAVE_PARALLEL_DOMAIN_AMDIS + double localResult = result; + MPI::COMM_WORLD.Allreduce(&localResult, &result, 1, MPI_DOUBLE, MPI_SUM); +#endif + + return result; } @@ -602,9 +668,15 @@ namespace AMDiS { elInfo = stack.traverseNext(elInfo); } - return result; +#ifdef HAVE_PARALLEL_DOMAIN_AMDIS + double localResult = result; + MPI::COMM_WORLD.Allreduce(&localResult, &result, 1, MPI_DOUBLE, MPI_SUM); +#endif + + return result; } + template<typename T> void DOFVector<T>::compressDOFIndexed(int first, int last, std::vector<DegreeOfFreedom> &newDOF) @@ -614,6 +686,7 @@ namespace AMDiS { vec[newDOF[i]] = vec[i]; } + template<typename T> Flag DOFVectorBase<T>::getAssembleFlag() { @@ -626,6 +699,7 @@ namespace AMDiS { return fillFlag; } + template<typename T> void DOFVectorBase<T>::finishAssembling() { @@ -635,6 +709,7 @@ namespace AMDiS { (*it)->finishAssembling(); } + template<typename T> DOFVector<T>& DOFVector<T>::operator=(const DOFVector<T>& rhs) { @@ -664,6 +739,7 @@ namespace AMDiS { return *this; } + template<typename T> const DOFVector<T>& operator*=(DOFVector<T>& x, T scal) { @@ -703,6 +779,7 @@ namespace AMDiS { return x; } + template<typename T> const DOFVector<T>& operator-=(DOFVector<T>& x, const DOFVector<T>& y) { @@ -725,6 +802,7 @@ namespace AMDiS { return x; } + template<typename T> const DOFVector<T>& operator*=(DOFVector<T>& x, const DOFVector<T>& y) { @@ -747,6 +825,7 @@ namespace AMDiS { return x; } + template<typename T> T operator*(DOFVector<T>& x, DOFVector<T>& y) { @@ -771,6 +850,7 @@ namespace AMDiS { return dot; } + template<typename T> void mv(MatrixTranspose transpose, const DOFMatrix &a, const DOFVector<T>&x, DOFVector<T> &result, bool add) @@ -806,6 +886,7 @@ namespace AMDiS { ERROR_EXIT("transpose = %d\n", transpose); } + template<typename T> void axpy(double alpha, const DOFVector<T>& x, DOFVector<T>& y) { @@ -831,6 +912,7 @@ namespace AMDiS { y[i] += alpha * x[i]; } + template<typename T> const DOFVector<T>& operator*(const DOFVector<T>& v, double d) { @@ -838,6 +920,7 @@ namespace AMDiS { return mult(d, v, result); } + template<typename T> const DOFVector<T>& operator*(double d, const DOFVector<T>& v) { @@ -845,6 +928,7 @@ namespace AMDiS { return mult(d, v, result); } + template<typename T> const DOFVector<T>& operator+(const DOFVector<T> &v1 , const DOFVector<T> &v2) { @@ -880,6 +964,7 @@ namespace AMDiS { y[i] = alpha * y[i] + x[i]; } + template<typename T> inline const DOFVector<T>& mult(double scal, const DOFVector<T>& v, @@ -894,6 +979,7 @@ namespace AMDiS { return result; } + template<typename T> inline const DOFVector<T>& add(const DOFVector<T>& v, double scal, @@ -1048,6 +1134,11 @@ namespace AMDiS { elInfo = stack.traverseNext(elInfo); } - return result; +#ifdef HAVE_PARALLEL_DOMAIN_AMDIS + double localResult = result; + MPI::COMM_WORLD.Allreduce(&localResult, &result, 1, MPI_DOUBLE, MPI_SUM); +#endif + + return result; } } diff --git a/AMDiS/src/parallel/MeshDistributor.cc b/AMDiS/src/parallel/MeshDistributor.cc index e0310499e918a142c15c9736604217f3036c3c19..b55ad5bf09c5a707eb3628fa157d4a05a850b6fe 100644 --- a/AMDiS/src/parallel/MeshDistributor.cc +++ b/AMDiS/src/parallel/MeshDistributor.cc @@ -138,12 +138,14 @@ namespace AMDiS { { FUNCNAME("MeshDistributor::initParallelization()"); + if (initialized) + return; + TEST_EXIT(mpiSize > 1) ("Parallelization does not work with only one process!\n"); TEST_EXIT(feSpace)("No FE space has been defined for the mesh distributor!\n"); TEST_EXIT(mesh)("No mesh has been defined for the mesh distributor!\n"); - TEST_EXIT(!initialized)("MeshDistributor is already initialized!\n"); #ifdef HAVE_ZOLTAN int a = 0;