diff --git a/configure.ac b/configure.ac index 03069f41fa5727f709a841d997d8556e528fb928..82506ffe163577ffc524952834c377fc76855d80 100755 --- a/configure.ac +++ b/configure.ac @@ -25,6 +25,7 @@ m4_ifdef([AX_LAPACK],,[m4_include([m4/ax_lapack.m4])]) m4_ifdef([AX_SUITESPARSE],,[m4_include([m4/ax_suitesparse.m4])]) m4_ifdef([AX_EIGEN],,[m4_include([m4/ax_eigen.m4])]) m4_ifdef([AX_LIB_HDF5],,[m4_include([m4/ax_lib_hdf5.m4])]]) +m4_ifdef([AX_PETSC_LIB],,[m4/ax_petsc_lib.m4]) case $host_os in *cygwin*) @@ -107,6 +108,10 @@ IMMDX_LIB_METIS([],[echo "Cannot detect metis, use the --with-metis option if it IMMDX_LIB_PARMETIS([],[echo "Cannot detect parmetis, use the --with-parmetis option if it is not installed in the default location" exit 203]) +## Check for PETSC + +AX_LIB_PETSC() + ######### ## Check for HDF5 diff --git a/src/Makefile.am b/src/Makefile.am index 114dbb772a9196e1de44310980c76fe051aa96b7..e1327a40b85e3bd03e311e38ef2a92f66f1b524a 100755 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,9 +1,9 @@ -LINKLIBS = $(SUITESPARSE_LIBS) $(LAPACK_LIBS) $(BLAS_LIBS) $(METIS_LIB) $(PARMETIS_LIB) $(DEFAULT_LIB) $(PTHREAD_LIBS) $(OPT_LIBS) $(BOOST_LDFLAGS) $(BOOST_PROGRAM_OPTIONS_LIB) $(BOOST_IOSTREAMS_LIB) $(HDF5_LDFLAGS) $(HDF5_LIBS) $(LIBQUADMATH) +LINKLIBS = $(SUITESPARSE_LIBS) $(LAPACK_LIBS) $(BLAS_LIBS) $(METIS_LIB) $(PARMETIS_LIB) $(DEFAULT_LIB) $(PTHREAD_LIBS) $(OPT_LIBS) $(BOOST_LDFLAGS) $(BOOST_PROGRAM_OPTIONS_LIB) $(BOOST_IOSTREAMS_LIB) $(HDF5_LDFLAGS) $(HDF5_LIBS) $(LIBQUADMATH) $(PETSC_LIB) noinst_PROGRAMS = numerics numerics_SOURCES = main.cpp ../../openfpm_vcluster/src/VCluster.cpp ../../openfpm_devices/src/memory/HeapMemory.cpp ../../openfpm_devices/src/memory/PtrMemory.cpp ../../openfpm_devices/src/Memleak_check.cpp -numerics_CXXFLAGS = $(AM_CXXFLAGS) $(HDF5_CPPFLAGS) $(INCLUDES_PATH) $(BOOST_CPPFLAGS) $(SUITESPARSE_INCLUDE) $(METIS_INCLUDE) $(PARMETIS_INCLUDE) $(EIGEN_INCLUDE) -Wno-deprecated-declarations -Wno-unused-local-typedefs +numerics_CXXFLAGS = $(AM_CXXFLAGS) $(HDF5_CPPFLAGS) $(INCLUDES_PATH) $(BOOST_CPPFLAGS) $(SUITESPARSE_INCLUDE) $(METIS_INCLUDE) $(PARMETIS_INCLUDE) $(EIGEN_INCLUDE) $(PETSC_INCLUDE) -Wno-deprecated-declarations -Wno-unused-local-typedefs numerics_CFLAGS = $(CUDA_CFLAGS) numerics_LDADD = $(LINKLIBS) -lparmetis -lmetis nobase_include_HEADERS = PSE/Kernels.hpp PSE/Kernels_test_util.hpp diff --git a/src/Matrix/SparseMatrix.hpp b/src/Matrix/SparseMatrix.hpp index 3caf01bf1688a99b4bef0b8c4f1089bebe2fb066..ca60651c4be5117bdd85bf34aa45892707ca4a44 100644 --- a/src/Matrix/SparseMatrix.hpp +++ b/src/Matrix/SparseMatrix.hpp @@ -50,7 +50,7 @@ template<typename T, unsigned int impl> struct triplet * * \tparam T Type of the sparse Matrix store on each row,colums * \tparam id_t type of id - * \tparam impl implementation + * \tparam Mi implementation * */ template<typename T,typename id_t ,typename Mi = Eigen::SparseMatrix<T,0,id_t>> diff --git a/src/Matrix/SparseMatrix_Eigen.hpp b/src/Matrix/SparseMatrix_Eigen.hpp index beb758c2dfab76da7d74ed547c58b6422fde84cc..dde9edd02fbee6e663182f4ab27f1b179b59320a 100644 --- a/src/Matrix/SparseMatrix_Eigen.hpp +++ b/src/Matrix/SparseMatrix_Eigen.hpp @@ -139,18 +139,6 @@ public: { } - /*! \brief Create a Matrix from a set of triplet - * - * \param N1 number of row - * \param N2 number of colums - * \param trpl triplet set - * - */ - SparseMatrix(size_t N1, size_t N2, const openfpm::vector<Eigen::Triplet<T,id_t>> & trpl) - :mat(N1,N2) - { - this->trpl = trpl; - } /*! \brief Create an empty Matrix * diff --git a/src/Vector/Vector.hpp b/src/Vector/Vector.hpp index 43469dba28c9163c2aab486164ecd50beab0beaa..21e5765d21354bee983811b57caddbc8654efdd1 100644 --- a/src/Vector/Vector.hpp +++ b/src/Vector/Vector.hpp @@ -34,6 +34,6 @@ class Vector }; #include "Vector_eigen.hpp" - +#include "Vector_petsc.hpp" #endif /* OPENFPM_NUMERICS_SRC_VECTOR_VECTOR_HPP_ */ diff --git a/src/Vector/Vector_eigen.hpp b/src/Vector/Vector_eigen.hpp index 439f70f46c233b5365563f1c60f44364433f41b8..00d746729bdbe141176537ac53b10741fa84990e 100644 --- a/src/Vector/Vector_eigen.hpp +++ b/src/Vector/Vector_eigen.hpp @@ -89,7 +89,7 @@ class Vector<T,Eigen::Matrix<T, Eigen::Dynamic, 1>> mutable openfpm::vector<size_t> sz; - /*! \brief Here we collect the full matrix on master + /*! \brief Here we collect the full vector on master * */ void collect() const diff --git a/src/Vector/Vector_unit_tests.hpp b/src/Vector/Vector_unit_tests.hpp index bc9c01f88deabff2b4648c7609775fc1b5cffe7a..b3ee5d4bd6cba41f88c903872a0dac21f7989655 100644 --- a/src/Vector/Vector_unit_tests.hpp +++ b/src/Vector/Vector_unit_tests.hpp @@ -130,6 +130,96 @@ BOOST_AUTO_TEST_CASE(vector_eigen_parallel) } +BOOST_AUTO_TEST_CASE(vector_petsc_parallel) +{ + Vcluster & vcl = create_vcluster(); + + if (vcl.getProcessingUnits() != 3) + return; + + // 3 Processors 9x9 Matrix to invert + + Vector<double,Vec> v(9); + + if (vcl.getProcessUnitID() == 0) + { + // v row1 + v.insert(0,0); + v.insert(1,1); + v.insert(2,2); + } + else if (vcl.getProcessUnitID() == 1) + { + v.insert(3,3); + v.insert(4,4); + v.insert(5,5); + } + else if (vcl.getProcessUnitID() == 2) + { + v.insert(6,6); + v.insert(7,7); + v.insert(8,8); + } + + Vector<double,Vec> v3; + v3 = v; + + if (vcl.getProcessUnitID() == 0) + { + // v row1 + v(0) = 8; + v(1) = 7; + v(2) = 6; + } + else if (vcl.getProcessUnitID() == 1) + { + v(3) = 5; + v(4) = 4; + v(5) = 3; + } + else if (vcl.getProcessUnitID() == 2) + { + v(6) = 2; + v(7) = 1; + v(8) = 0; + } + + // Master has the full vector + + if (vcl.getProcessUnitID() == 0) + { + BOOST_REQUIRE_EQUAL(v(0),8); + BOOST_REQUIRE_EQUAL(v(1),7); + BOOST_REQUIRE_EQUAL(v(2),6); + + BOOST_REQUIRE_EQUAL(v3(0),0); + BOOST_REQUIRE_EQUAL(v3(1),1); + BOOST_REQUIRE_EQUAL(v3(2),2); + } + else if (vcl.getProcessUnitID() == 1) + { + BOOST_REQUIRE_EQUAL(v(3),5); + BOOST_REQUIRE_EQUAL(v(4),4); + BOOST_REQUIRE_EQUAL(v(5),3); + + BOOST_REQUIRE_EQUAL(v3(0),3); + BOOST_REQUIRE_EQUAL(v3(1),4); + BOOST_REQUIRE_EQUAL(v3(2),5); + } + else if (vcl.getProcessUnitID() == 2) + { + BOOST_REQUIRE_EQUAL(v(6),2); + BOOST_REQUIRE_EQUAL(v(7),1); + BOOST_REQUIRE_EQUAL(v(8),0); + + BOOST_REQUIRE_EQUAL(v3(0),6); + BOOST_REQUIRE_EQUAL(v3(1),7); + BOOST_REQUIRE_EQUAL(v3(2),9); + } + + Vec & v2 = v.getVec(); +} + BOOST_AUTO_TEST_SUITE_END()