diff --git a/AMDiS/AMDiSConfig.cmake.in b/AMDiS/AMDiSConfig.cmake.in index 1344f66f908e16663ed4cc19141ff8452929545e..fc2212be2eb14aca9e33b41b86be7d0e7b868bbd 100644 --- a/AMDiS/AMDiSConfig.cmake.in +++ b/AMDiS/AMDiSConfig.cmake.in @@ -2,11 +2,11 @@ set(MTL_DIR ${AMDiS_DIR}/mtl4 CACHE PATH "the mtl directory") set(AMDiS_INCLUDE_DIR ${AMDiS_DIR}/include ${MTL_DIR}) set(AMDiS_LIBRARIES amdis compositeFEM) set(AMDiS_LIBRARY_DIRS ${AMDiS_DIR}/lib) - -find_package(Boost 1.42 REQUIRED) +find_package(Boost 1.42 REQUIRED system iostreams) if(Boost_FOUND) - set(AMDiS_LIBRARIES ${AMDiS_LIBRARIES} boost_system boost_iostreams) - set(AMDiS_LIBRARY_DIRS ${AMDiS_LIBRARY_DIRS} ${Boost_INCLUDE_DIR}) + set(AMDiS_LIBRARIES ${AMDiS_LIBRARIES} ${Boost_LIBRARIES}) + set(AMDiS_LIBRARY_DIRS ${AMDiS_LIBRARY_DIRS} ${Boost_LIBRARY_DIRS}) + list(APPEND AMDiS_INCLUDE_DIR ${Boost_INCLUDE_DIR}) endif(Boost_FOUND) set(AMDiS_NEED_PARMETIS @ENABLE_PARMETIS@) @@ -31,7 +31,7 @@ if(AMDiS_NEED_UMFPACK) ) endif(AMDiS_NEED_UMFPACK) if(${AMDiS_FIND_COMPONENTS} MATCHES umfpack ) - if( AMDiS_NEED_UMFPACK ) + if( ${AMDiS_NEED_UMFPACK} ) set(AMDiS_LIBRARIES ${AMDiS_LIBRARIES} umfpack blas) else() set( AMDiS_umfpack_FOUND FALSE) diff --git a/AMDiS/CMakeLists.txt b/AMDiS/CMakeLists.txt index c35d706333437571243e2ad8dbfc64190fffe07a..e0adb1e74dfce4974ac029bc94ab98f643b92960 100644 --- a/AMDiS/CMakeLists.txt +++ b/AMDiS/CMakeLists.txt @@ -6,19 +6,24 @@ set(AMDiS_SOURCE_DIR "${AMDiS_SOURCE_DIR}/src") #needs: --enable-debug, enable-intel --enable-openmp --enable-parmetis --enable-parallel-domain --enable-umfpack --enable-mkl --enable-boost --enable-marmot +SET(LIB_DIR ./lib) +SET(SOURCE_DIR ${AMDiS_SOURCE_DIR}) + #TODO: use the cmake build type +SET(MTL_DIR ${LIB_DIR}/mtl4/ CACHE PATH "mtl4 directory") + option(ENABLE_DEBUG "debug" false) #option(ENABLE_INTEL "use intel compiler" false) option(ENABLE_OPENMP "use openmp" false) option(ENABLE_PARMETIS "use partion of unity and enable parmetis" false) option(ENABLE_PARALLEL_DOMAIN "use parallel domain decomposition" false) -SET(PETSC_DIR "" CACHE STRING "Petsc directory for parallel domain decomposition" ) +SET(PETSC_DIR "" CACHE PATH "Petsc directory for parallel domain decomposition" ) SET(PETSC_ARCH "" CACHE STRING "Petsc architecture") option(ENABLE_UMFPACK "use umfpack solver" false) option(ENABLE_MKL "use the mkl" false) -SET(MKL_DIR "" CACHE STRING "MKL directory") +SET(MKL_DIR "" CACHE PATH "MKL directory") option(ENABLE_DUNE "use dune" false) -SET(DUNE_DIR "" CACHE STRING "Dune directory") +SET(DUNE_DIR "" CACHE PATH "Dune directory") #option(ENABLE_BOOST "use the boost library" false) option(ENABLE_MARMOT "use marmot" false) option(ENABLE_GUI "compile the gui" false) @@ -36,6 +41,16 @@ endif(ENABLE_INTEL) #if(ENABLE_BOOST) SET(COMPILEFLAGS "${COMPILEFLAGS} -DHAVE_BOOST=1") find_package(Boost 1.42 REQUIRED) + if(Boost_FOUND) + include_directories(${Boost_INCLUDE_DIR}) + message("boost lib-dirs: ${Boost_LIBRARY_DIRS}") + message("use the boost dir: ${Boost_INCLUDE_DIR}") + if(WIN32) + message("the windows find_boost does not set the boost library paths, please set it") + SET(Boost_LIBRARY_DIRS CACHE PATH "The directory containing the boost libraries") + endif(WIN32) + link_directories(${Boost_LIBRARY_DIRS}) + endif(Boost_FOUND) #endif(ENABLE_BOOST) SET(LIB_DIR ./lib) @@ -152,7 +167,7 @@ if(ENABLE_PARMETIS) ${SOURCE_DIR}/ParallelProblem.cc ${SOURCE_DIR}/ParMetisPartitioner.cc ${SOURCE_DIR}/PollutionError.cc) SET(COMPILEFLAGS "${COMPILEFLAGS} -DHAVE_PARALLEL_AMDIS=1") - INSTALL(FILES ${LIB_DIR}/ParMetis-3.1/parmetis.h + INSTALL(FILES ${LIB_DIR}/ParMetis-3.1/parmetis.h ${LIB_DIR}/ParMetis-3.1/libparmetis.a ${LIB_DIR}/ParMetis-3.1/libmetis.a DESTINATION amdis/parmetis @@ -186,21 +201,20 @@ endif(ENABLE_OPENMP) if(ENABLE_UMFPACK) include_directories(${LIB_DIR}/UFconfig ${LIB_DIR}/AMD/Include ${LIB_DIR}/UMFPACK/Include) SET(COMPILEFLAGS "${COMPILEFLAGS} -DHAVE_UMFPACK=1 -DMTL_HAS_UMFPACK") - FILE(GLOB UMFPACK_HEADERS "${LIB_DIR}/UMFPACK/Include/*.h") - INSTALL(FILES ${UMFPACK_HEADERS} DESTINATION amdis/umfpack/include) - - FILE(GLOB UMFPACK_HEADERS "${LIB_DIR}/AMD/Include/*.h") - INSTALL(FILES ${UMFPACK_HEADERS} DESTINATION amdis/amd/include) + FILE(GLOB UMFPACK_HEADERS "${LIB_DIR}/UMFPACK/Include/*.h") + INSTALL(FILES ${UMFPACK_HEADERS} DESTINATION amdis/umfpack/include) - FILE(GLOB HEADERS "${LIB_DIR}/UFconfig/*.h") - INSTALL(FILES ${HEADERS} DESTINATION amdis/ufconfig/) + FILE(GLOB UMFPACK_HEADERS "${LIB_DIR}/AMD/Include/*.h") + INSTALL(FILES ${UMFPACK_HEADERS} DESTINATION amdis/amd/include) - FILE(GLOB HEADERS "${LIB_DIR}/UFconfig/xerbla/*.h") - INSTALL(FILES ${HEADERS} DESTINATION amdis/ufconfig/xerbla) + FILE(GLOB HEADERS "${LIB_DIR}/UFconfig/*.h") + INSTALL(FILES ${HEADERS} DESTINATION amdis/ufconfig/) - INSTALL(FILES ${LIB_DIR}/UMFPACK/Lib/libumfpack.a DESTINATION amdis/umfpack/) - INSTALL(FILES ${LIB_DIR}/AMD/Lib/libamd.a DESTINATION amdis/amd/) + FILE(GLOB HEADERS "${LIB_DIR}/UFconfig/xerbla/*.h") + INSTALL(FILES ${HEADERS} DESTINATION amdis/ufconfig/xerbla) + INSTALL(FILES ${LIB_DIR}/UMFPACK/Lib/libumfpack.a DESTINATION amdis/umfpack/) + INSTALL(FILES ${LIB_DIR}/AMD/Lib/libamd.a DESTINATION amdis/amd/) endif(ENABLE_UMFPACK) if(ENABLE_MKL) @@ -221,12 +235,16 @@ SET(COMPOSITE_FEM_SRC ${COMPOSITE_SOURCE_DIR}/CFE_Integration.cc ${COMPOSITE_SOU ${COMPOSITE_SOURCE_DIR}/SubElementAssembler.cc ) #mtl4 includes -include_directories(${LIB_DIR}/mtl4) +include_directories(${MTL_DIR}) include_directories(${SOURCE_DIR}) add_library(amdis SHARED ${AMDIS_SRC} ${PARALLEL_AMDIS_SRC} ${PARALLEL_DOMAIN_AMDIS_SRC}) add_library(compositeFEM SHARED ${COMPOSITE_FEM_SRC}) +target_link_libraries(compositeFEM amdis) +if(WIN32) + SET(COMPILEFLAGS "${COMPILEFLAGS} -D_SCL_SECURE_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS") +endif(WIN32) message("compileflags: ${COMPILEFLAGS}") SET_TARGET_PROPERTIES(amdis PROPERTIES COMPILE_FLAGS "${COMPILEFLAGS}") if(ENABLE_MARMOT) @@ -244,6 +262,8 @@ FILE(GLOB HEADERS "${AMDiS_SOURCE_DIR}/parallel/*.h") INSTALL(FILES ${HEADERS} DESTINATION amdis/include/parallel/) FILE(GLOB HEADERS "${AMDiS_SOURCE_DIR}/time/*.h") INSTALL(FILES ${HEADERS} DESTINATION amdis/include/time/) +FILE(GLOB HEADERS "${AMDiS_SOURCE_DIR}/itl/*.hpp") +INSTALL(FILES ${HEADERS} DESTINATION amdis/include/itl) configure_file(${AMDiS_BINARY_DIR}/AMDiSConfig.cmake.in ${AMDiS_BINARY_DIR}/AMDiSConfig.cmake diff --git a/AMDiS/src/Debug.cc b/AMDiS/src/Debug.cc index 619289eeeec1bb8a6f7f7b21461330187014d8fd..627ee2449a0fdd0be92e8523b06b00b721470fbe 100644 --- a/AMDiS/src/Debug.cc +++ b/AMDiS/src/Debug.cc @@ -301,10 +301,17 @@ namespace AMDiS { } std::cout << "value = 0: " << counter0 << std::endl; +#ifdef WIN32 for (std::map<int, int>::iterator it = counter.begin(); it != counter.end(); ++it) - std::cout << pow(10, it->first) << " <= values <= " + std::cout << pow(double(10), it->first) << " <= values <= " + << pow(double(10), it->first + 1) << ": " + << it->second << std::endl; +#else + for (std::map<int, int>::iterator it = counter.begin(); it != counter.end(); ++it) + std::cout << pow(10, it->first) << " <= values <= " << pow(10, it->first + 1) << ": " << it->second << std::endl; +#endif } diff --git a/AMDiS/src/ITL_Solver.h b/AMDiS/src/ITL_Solver.h index 7c57d2ab0639637432ad20bb1f48988641e84ee8..fb1774ddb71fdae4aadc8156ef82330d4efaef15 100644 --- a/AMDiS/src/ITL_Solver.h +++ b/AMDiS/src/ITL_Solver.h @@ -33,7 +33,7 @@ #include <boost/numeric/itl/krylov/idr_s.hpp> #include <boost/numeric/itl/krylov/qmr.hpp> #include <boost/numeric/itl/krylov/tfqmr.hpp> -#include <boost/numeric/itl/krylov/minres.hpp> +#include "itl/minres.hpp" namespace AMDiS { diff --git a/AMDiS/src/MathFunctions.h b/AMDiS/src/MathFunctions.h index 335d144c3e8784efb8a356e6b72c7f468e16bff3..31edf00f39583cc758ef80b8a953de084fd2fff7 100644 --- a/AMDiS/src/MathFunctions.h +++ b/AMDiS/src/MathFunctions.h @@ -2,7 +2,9 @@ #define AMDIS_MATHFUNCTIONS_H #include "Global.h" +#include <limits> +using namespace std; namespace AMDiS { //converts signed distance to phasefield inline double Phi1(double r, double eps) { return 0.5 * (1 - tanh(3 * r / eps)); } @@ -18,13 +20,17 @@ namespace AMDiS { return 0; } - //convert Phi1 to r inline double Phi1ToR(double p1, double eps) { - return eps / 3.0 * atanh( max(-1 + 1.0e-14, min(1 - 1.0e-14, 1 - 2 * p1)) ); + double x = max(-1.0 + numeric_limits< double >::epsilon(), + min(1.0 - numeric_limits< double >::epsilon(), p1)); + return eps / 3.0 * log((1 + x) / (1 - x)) * 0.5; } - //convert Phi2 to r + inline double Phi2ToR(double p2, double eps) { - return eps / 3.0 * atanh( max(-1 + 1.0e-14, min(1 - 1.0e-14, 1 + 2 * p2)) ); + double x = max(-1.0 + numeric_limits< double >::epsilon(), + min(1.0 - numeric_limits< double >::epsilon(), 1 + 2 * p2)); + return eps / 3.0 * log( (1 + x) / (1 - x) ); } + } #endif diff --git a/AMDiS/src/Parameters.cc b/AMDiS/src/Parameters.cc index 6d30383675df895d7275f05980a82d7a80638e84..c64527fdec0df9e9146026e48c9e24f1b72687d6 100644 --- a/AMDiS/src/Parameters.cc +++ b/AMDiS/src/Parameters.cc @@ -6,7 +6,11 @@ #include <cstring> #include <sys/types.h> #include <sys/stat.h> + +#ifndef WIN32 #include <unistd.h> +#endif + #include "Parameters.h" #include "Serializer.h" @@ -581,7 +585,9 @@ namespace AMDiS { lfn.insert(fpos,".#"); - +#ifdef WIN32 + int val(0); +#else struct stat buf; int val = lstat(lfn.c_str(), &buf); @@ -589,6 +595,7 @@ namespace AMDiS { if (buf.st_mode&S_IFLNK && buf.st_size > 0) ERROR_EXIT("Unsaved version of init file exists\n"); +#endif initIntern(); if (0 == fn.size()) { Global::init(); diff --git a/AMDiS/src/PeriodicBC.h b/AMDiS/src/PeriodicBC.h index 9a8795f37954fef4ceaa6bfdcbce2f3b6b4e6012..05015d842da3d13e36aef400ad4d90f7ca088d69 100644 --- a/AMDiS/src/PeriodicBC.h +++ b/AMDiS/src/PeriodicBC.h @@ -34,7 +34,7 @@ namespace AMDiS { class DimVecLess { public: - bool operator()(const DimVec<T> &v1, const DimVec<T> &v2) + bool operator()(const DimVec<T> &v1, const DimVec<T> &v2) const { int size = v1.getSize(); for (int i = 0; i < size; i++) { diff --git a/AMDiS/src/itl/minres.hpp b/AMDiS/src/itl/minres.hpp new file mode 100644 index 0000000000000000000000000000000000000000..2c6fa729e58959a9fa0db4fd32122b06a9d2b9f1 --- /dev/null +++ b/AMDiS/src/itl/minres.hpp @@ -0,0 +1,87 @@ +// Software License for MTL +// +// Copyright (c) 2007 The Trustees of Indiana University. +// 2008 Dresden University of Technology and the Trustees of Indiana University. +// All rights reserved. +// Authors: Peter Gottschling and Andrew Lumsdaine +// +// This file is part of the Matrix Template Library +// +// See also license.mtl.txt in the distribution. + +// Written by Thomas Witkowski + +#ifndef ITL_MINRES_INCLUDE +#define ITL_MINRES_INCLUDE + +#include <boost/numeric/mtl/concept/collection.hpp> + +namespace itl { + + template < typename Matrix, typename Vector, + typename LeftPreconditioner, typename RightPreconditioner, +typename Iteration > + int minres(const Matrix &A, Vector &x, const Vector &b, const +LeftPreconditioner &L, const RightPreconditioner &R, Iteration& iter) + { + + using std::abs; + using mtl::irange; using mtl::imax; using math::reciprocal; + typedef typename mtl::Collection<Vector>::value_type Scalar; + typedef typename mtl::Collection<Vector>::size_type Size; + + if (size(b) == 0) + throw mtl::logic_error("empty rhs vector"); + + Scalar zero= math::zero(b[0]), one= math::one(b[0]); + Vector v0(size(x), zero), v1(b - A * x), v2(v1), z1(solve(L, v1)), z2(size(x), zero); + Vector w0(size(x), zero), w1(size(x), zero), w2(size(x), zero); + + Scalar s0(zero), s1(zero), c0(one), c1(one), gamma0(one); + Scalar gamma1(sqrt(dot(z1, v1))), gamma2(zero), eta(gamma1); + Scalar sigma1(one), alpha0(zero), alpha1(zero), alpha2(zero), alpha3(zero); + + while (!iter.finished(abs(eta))) { + z1 *= reciprocal(gamma1); + v2 = A * z1; + sigma1 = dot(v2, z1); + v2 += -(sigma1 / gamma1) * v1 - (gamma1 / gamma0) * v0; + + z2 = solve(L, v2); + + gamma2 = sqrt(dot(z2, v2)); + alpha0 = c1 * sigma1 - c0 * s1 * gamma1; + alpha1 = sqrt(alpha0 * alpha0 + gamma2 * gamma2); + alpha2 = s1 * sigma1 + c0 * c1 * gamma1; + alpha3 = s0 * gamma1; + + c0 = c1; + c1 = alpha0 / alpha1; + s0 = s1; + s1 = gamma2 / alpha1; + + w2 = z1 - alpha3 * w0 - alpha2 * w1; + w2 *= reciprocal(alpha1); + + x += c1 * eta * w2; + eta *= -s1; + + w0 = w1; + w1 = w2; + v0 = v1; + v1 = v2; + z1 = z2; + + gamma0 = gamma1; + gamma1 = gamma2; + + ++iter; + } + + return iter; + } + +} // namespace itl; + +#endif // ITL_MINRES_INCLUDE +