]> https://gitweb.dealii.org/ - dealii.git/commitdiff
fix sundials interface for NON-MPI installations 5196/head
authorAlberto Sartori <alberto.sartori86@gmail.com>
Wed, 4 Oct 2017 10:04:57 +0000 (12:04 +0200)
committerAlberto Sartori <alberto.sartori86@gmail.com>
Wed, 4 Oct 2017 15:41:10 +0000 (17:41 +0200)
cmake/modules/FindSUNDIALS.cmake
include/deal.II/sundials/arkode.h
include/deal.II/sundials/copy.h
include/deal.II/sundials/ida.h
source/sundials/arkode.cc
source/sundials/copy.cc
source/sundials/ida.cc

index cad258d87e678c02f0bd3462a28ebb5078fb65c2..bddb8c8d51b3636d53ad3df725d956a4408f5e20 100644 (file)
@@ -79,8 +79,6 @@ IF(DEAL_II_WITH_MPI)
     PATH_SUFFIXES lib${LIB_SUFFIX} lib64 lib
     )
   SET(_sundials_additional_libs SUNDIALS_LIB_PAR)
-ENDIF()
-
 DEAL_II_PACKAGE_HANDLE(SUNDIALS
   LIBRARIES REQUIRED
     SUNDIALS_LIB_IDA SUNDIALS_LIB_ARKODE SUNDIALS_LIB_KINSOL SUNDIALS_LIB_SER SUNDIALS_LIB_PAR
@@ -89,5 +87,19 @@ DEAL_II_PACKAGE_HANDLE(SUNDIALS
   USER_INCLUDE_DIRS REQUIRED SUNDIALS_INCLUDE_DIR
   CLEAR
     SUNDIALS_LIB_IDA SUNDIALS_LIB_ARKODE SUNDIALS_LIB_KINSOL 
-    SUNDIALS_LIB_SER SUNDIALS_LIB_PAR SUN_INC
+    SUNDIALS_LIB_SER SUNDIALS_LIB_PAR
   )
+ELSE()
+DEAL_II_PACKAGE_HANDLE(SUNDIALS
+  LIBRARIES REQUIRED
+    SUNDIALS_LIB_IDA SUNDIALS_LIB_ARKODE SUNDIALS_LIB_KINSOL SUNDIALS_LIB_SER
+    ${_sundials_additional_libs}
+  INCLUDE_DIRS REQUIRED SUNDIALS_INCLUDE_DIR
+  USER_INCLUDE_DIRS REQUIRED SUNDIALS_INCLUDE_DIR
+  CLEAR
+    SUNDIALS_LIB_IDA SUNDIALS_LIB_ARKODE SUNDIALS_LIB_KINSOL 
+    SUNDIALS_LIB_SER
+  )
+
+ENDIF()
+
index 5877e64dd24dec9c12647097a8365d5470502a9a..c8b90f41154b48f726195741cd768be5e412007a 100644 (file)
@@ -17,6 +17,7 @@
 #define dealii_sundials_arkode_h
 
 #include <deal.II/base/config.h>
+#include <deal.II/base/mpi.h>
 #ifdef DEAL_II_WITH_SUNDIALS
 
 #include <deal.II/base/logstream.h>
@@ -36,6 +37,9 @@
 #include <arkode/arkode.h>
 #include <arkode/arkode_impl.h>
 #include <nvector/nvector_serial.h>
+#ifdef DEAL_II_WITH_MPI
+#include <nvector/nvector_parallel.h>
+#endif
 #include <sundials/sundials_math.h>
 #include <sundials/sundials_types.h>
 
@@ -360,7 +364,7 @@ namespace SUNDIALS
         maximum_non_linear_iterations(maximum_non_linear_iterations),
         implicit_function_is_linear(implicit_function_is_linear),
         implicit_function_is_time_independent(implicit_function_is_time_independent)
-      {};
+      {}
 
       /**
        * Add all AdditionalData() parameters to the given ParameterHandler
@@ -487,6 +491,9 @@ namespace SUNDIALS
      * passing an AdditionalData() object that sets all of the solver
      * parameters.
      *
+     * The MPI communicator is simply ignored in the serial case.
+     *
+     *
      * @param data ARKode configuration data
      * @param mpi_comm MPI communicator
      */
@@ -851,12 +858,12 @@ namespace SUNDIALS
      */
     N_Vector abs_tolls;
 
-#ifdef DEAL_II_WITH_MPI
     /**
-     * MPI communicator. SUNDIALS solver runs happily in parallel.
+     * MPI communicator. SUNDIALS solver runs happily in
+     * parallel. Note that if the library is compiled without MPI
+     * support, MPI_Comm is typedefed as int.
      */
     MPI_Comm communicator;
-#endif
 
     /**
      * Memory pool of vectors.
index b4e25b37f9abd3b8c01bd8dc6530e5f273de9719..3b1994b0036735ab70f7c503e4c85e67419b6b6e 100644 (file)
 #ifdef DEAL_II_WITH_SUNDIALS
 
 #include <sundials/sundials_nvector.h>
+#ifdef DEAL_II_WITH_MPI
 #include <nvector/nvector_parallel.h>
+#endif
 #include <nvector/nvector_serial.h>
 
 #include <deal.II/lac/vector.h>
 #include <deal.II/lac/block_vector.h>
 
+#ifdef DEAL_II_WITH_TRILINOS
 #include <deal.II/lac/trilinos_vector.h>
 #include <deal.II/lac/trilinos_parallel_block_vector.h>
+#endif
 
+#ifdef DEAL_II_WITH_PETSC
 #include <deal.II/lac/petsc_parallel_vector.h>
 #include <deal.II/lac/petsc_parallel_block_vector.h>
-
+#endif
 
 DEAL_II_NAMESPACE_OPEN
 namespace SUNDIALS
index 38bddded3902c797d1ab6f2ca9cc1e2547d612db..f13fe1be1a07bf887f4678c47b74da6bc8d4195d 100644 (file)
@@ -17,6 +17,7 @@
 #define dealii_sundials_ida_h
 
 #include <deal.II/base/config.h>
+#include <deal.II/base/mpi.h>
 #ifdef DEAL_II_WITH_SUNDIALS
 
 #include <deal.II/base/logstream.h>
@@ -328,7 +329,7 @@ namespace SUNDIALS
         maximum_non_linear_iterations_ic(maximum_non_linear_iterations_ic),
         maximum_non_linear_iterations(maximum_non_linear_iterations),
         use_local_tolerances(use_local_tolerances)
-      {};
+      {}
 
       /**
        * Add all AdditionalData() parameters to the given ParameterHandler
@@ -562,6 +563,8 @@ namespace SUNDIALS
      * consistent. Then you can choose how these are made consistent, using the same three
      * options that you used for the initial conditions in `reset_type`.
      *
+     * The MPI communicator is simply ignored in the serial case.
+     *
      * @param data IDA configuration data
      * @param mpi_comm MPI communicator
      */
@@ -804,12 +807,12 @@ namespace SUNDIALS
      */
     N_Vector diff_id;
 
-#ifdef DEAL_II_WITH_MPI
     /**
-     * MPI communicator. SUNDIALS solver runs happily in parallel.
+     * MPI communicator. SUNDIALS solver runs happily in
+     * parallel. Note that if the library is compiled without MPI
+     * support, MPI_Comm is typedefed as int.
      */
     MPI_Comm communicator;
-#endif
 
     /**
      * Memory pool of vectors.
index b6a6dad4e80220441b5747c90a6ad9e14ad9bec2..abd5d307c63313b8229f6c9b3f8125d665a1de89 100644 (file)
@@ -208,7 +208,8 @@ namespace SUNDIALS
   }
 
   template <typename VectorType>
-  ARKode<VectorType>::ARKode(const AdditionalData &data, const MPI_Comm mpi_comm) :
+  ARKode<VectorType>::ARKode(const AdditionalData &data,
+                             const MPI_Comm mpi_comm) :
     data(data),
     arkode_mem(nullptr),
     communicator(Utilities::MPI::duplicate_communicator(mpi_comm))
@@ -221,7 +222,9 @@ namespace SUNDIALS
   {
     if (arkode_mem)
       ARKodeFree(&arkode_mem);
+#ifdef DEAL_II_WITH_MPI
     MPI_Comm_free(&communicator);
+#endif
   }
 
 
@@ -231,7 +234,6 @@ namespace SUNDIALS
   {
 
     unsigned int system_size = solution.size();
-    unsigned int local_system_size = system_size;
 
     double t = data.initial_time;
     double h = data.initial_step_size;
@@ -246,8 +248,8 @@ namespace SUNDIALS
 #ifdef DEAL_II_WITH_MPI
     if (is_serial_vector<VectorType>::value == false)
       {
-        IndexSet is = solution.locally_owned_elements();
-        local_system_size = is.n_elements();
+        const IndexSet is = solution.locally_owned_elements();
+        const size_t local_system_size = is.n_elements();
 
         yy        = N_VNew_Parallel(communicator,
                                     local_system_size,
@@ -320,7 +322,6 @@ namespace SUNDIALS
   {
 
     unsigned int system_size;
-    unsigned int local_system_size;
 
     if (arkode_mem)
       ARKodeFree(&arkode_mem);
@@ -350,8 +351,8 @@ namespace SUNDIALS
 #ifdef DEAL_II_WITH_MPI
     if (is_serial_vector<VectorType>::value == false)
       {
-        IndexSet is = solution.locally_owned_elements();
-        local_system_size = is.n_elements();
+        const IndexSet is = solution.locally_owned_elements();
+        const size_t local_system_size = is.n_elements();
 
         yy        = N_VNew_Parallel(communicator,
                                     local_system_size,
index 767c7f625e2390f6afedc1efb6b98c07fbdfeca6..0dd6eb6089da80a9e4149ae442b2574ffde0a29e 100644 (file)
@@ -42,11 +42,13 @@ namespace SUNDIALS
           length = NV_LENGTH_S(vec);
           break;
         }
+#ifdef DEAL_II_WITH_MPI
         case SUNDIALS_NVEC_PARALLEL:
         {
           length = NV_LOCLENGTH_P(vec);
           break;
         }
+#endif
         default:
           Assert(false, ExcNotImplemented());
         }
@@ -62,9 +64,10 @@ namespace SUNDIALS
 
     void copy(TrilinosWrappers::MPI::Vector &dst, const N_Vector &src)
     {
-      IndexSet is = dst.locally_owned_elements();
-      AssertDimension(is.n_elements(), N_Vector_length(src));
-      for (unsigned int i=0; i<is.n_elements(); ++i)
+      const IndexSet is = dst.locally_owned_elements();
+      const size_t N = is.n_elements();
+      AssertDimension(N, N_Vector_length(src));
+      for (size_t i=0; i<N; ++i)
         {
           dst[is.nth_index_in_set(i)] = NV_Ith_P(src, i);
         }
@@ -73,9 +76,10 @@ namespace SUNDIALS
 
     void copy(N_Vector &dst, const TrilinosWrappers::MPI::Vector &src)
     {
-      IndexSet is = src.locally_owned_elements();
-      AssertDimension(is.n_elements(), N_Vector_length(dst));
-      for (unsigned int i=0; i<is.n_elements(); ++i)
+      const IndexSet is = src.locally_owned_elements();
+      const size_t N = is.n_elements();
+      AssertDimension(N, N_Vector_length(dst));
+      for (size_t i=0; i<N; ++i)
         {
           NV_Ith_P(dst, i) = src[is.nth_index_in_set(i)];
         }
@@ -83,9 +87,10 @@ namespace SUNDIALS
 
     void copy(TrilinosWrappers::MPI::BlockVector &dst, const N_Vector &src)
     {
-      IndexSet is = dst.locally_owned_elements();
-      AssertDimension(is.n_elements(), N_Vector_length(src));
-      for (unsigned int i=0; i<is.n_elements(); ++i)
+      const IndexSet is = dst.locally_owned_elements();
+      const size_t N = is.n_elements();
+      AssertDimension(N, N_Vector_length(src));
+      for (size_t i=0; i<N; ++i)
         {
           dst[is.nth_index_in_set(i)] = NV_Ith_P(src, i);
         }
@@ -95,8 +100,9 @@ namespace SUNDIALS
     void copy(N_Vector &dst, const TrilinosWrappers::MPI::BlockVector &src)
     {
       IndexSet is = src.locally_owned_elements();
-      AssertDimension(is.n_elements(), N_Vector_length(dst));
-      for (unsigned int i=0; i<is.n_elements(); ++i)
+      const size_t N = is.n_elements();
+      AssertDimension(N, N_Vector_length(dst));
+      for (size_t i=0; i<N; ++i)
         {
           NV_Ith_P(dst, i) = src[is.nth_index_in_set(i)];
         }
@@ -109,9 +115,10 @@ namespace SUNDIALS
 
     void copy(PETScWrappers::MPI::Vector &dst, const N_Vector &src)
     {
-      IndexSet is = dst.locally_owned_elements();
-      AssertDimension(is.n_elements(), N_Vector_length(src));
-      for (unsigned int i=0; i<is.n_elements(); ++i)
+      const IndexSet is = dst.locally_owned_elements();
+      const size_t N = is.n_elements();
+      AssertDimension(N, N_Vector_length(src));
+      for (size_t i=0; i<N; ++i)
         {
           dst[is.nth_index_in_set(i)] = NV_Ith_P(src, i);
         }
@@ -120,9 +127,10 @@ namespace SUNDIALS
 
     void copy(N_Vector &dst, const PETScWrappers::MPI::Vector &src)
     {
-      IndexSet is = src.locally_owned_elements();
-      AssertDimension(is.n_elements(), N_Vector_length(dst));
-      for (unsigned int i=0; i<is.n_elements(); ++i)
+      const IndexSet is = src.locally_owned_elements();
+      const size_t N = is.n_elements();
+      AssertDimension(N, N_Vector_length(dst));
+      for (size_t i=0; i<N; ++i)
         {
           NV_Ith_P(dst, i) = src[is.nth_index_in_set(i)];
         }
@@ -130,9 +138,10 @@ namespace SUNDIALS
 
     void copy(PETScWrappers::MPI::BlockVector &dst, const N_Vector &src)
     {
-      IndexSet is = dst.locally_owned_elements();
-      AssertDimension(is.n_elements(), N_Vector_length(src));
-      for (unsigned int i=0; i<is.n_elements(); ++i)
+      const IndexSet is = dst.locally_owned_elements();
+      const size_t N = is.n_elements();
+      AssertDimension(N, N_Vector_length(src));
+      for (size_t i=0; i<N; ++i)
         {
           dst[is.nth_index_in_set(i)] = NV_Ith_P(src, i);
         }
@@ -141,9 +150,10 @@ namespace SUNDIALS
 
     void copy(N_Vector &dst, const PETScWrappers::MPI::BlockVector &src)
     {
-      IndexSet is = src.locally_owned_elements();
-      AssertDimension(is.n_elements(), N_Vector_length(dst));
-      for (unsigned int i=0; i<is.n_elements(); ++i)
+      const IndexSet is = src.locally_owned_elements();
+      const size_t N = is.n_elements();
+      AssertDimension(N, N_Vector_length(dst));
+      for (size_t i=0; i<N; ++i)
         {
           NV_Ith_P(dst, i) = src[is.nth_index_in_set(i)];
         }
@@ -156,8 +166,9 @@ namespace SUNDIALS
 
     void copy(BlockVector<double> &dst, const N_Vector &src)
     {
-      AssertDimension(N_Vector_length(src), dst.size());
-      for (unsigned int i=0; i<dst.size(); ++i)
+      const size_t N = dst.size();
+      AssertDimension(N_Vector_length(src), N);
+      for (size_t i=0; i<N; ++i)
         {
           dst[i] = NV_Ith_S(src, i);
         }
@@ -165,8 +176,9 @@ namespace SUNDIALS
 
     void copy(N_Vector &dst, const BlockVector<double> &src)
     {
-      AssertDimension(N_Vector_length(dst), src.size());
-      for (unsigned int i=0; i<src.size(); ++i)
+      const size_t N = src.size();
+      AssertDimension(N_Vector_length(dst), N);
+      for (size_t i=0; i<N; ++i)
         {
           NV_Ith_S(dst, i) = src[i];
         }
@@ -174,8 +186,9 @@ namespace SUNDIALS
 
     void copy(Vector<double> &dst, const N_Vector &src)
     {
-      AssertDimension(N_Vector_length(src), dst.size());
-      for (unsigned int i=0; i<dst.size(); ++i)
+      const size_t N = dst.size();
+      AssertDimension(N_Vector_length(src), N);
+      for (size_t i=0; i<N; ++i)
         {
           dst[i] = NV_Ith_S(src, i);
         }
@@ -183,8 +196,9 @@ namespace SUNDIALS
 
     void copy(N_Vector &dst, const Vector<double> &src)
     {
-      AssertDimension(N_Vector_length(dst), src.size());
-      for (unsigned int i=0; i<src.size(); ++i)
+      const size_t N = src.size();
+      AssertDimension(N_Vector_length(dst), N);
+      for (size_t i=0; i<N; ++i)
         {
           NV_Ith_S(dst, i) = src[i];
         }
index 228f7538a3a86961b85e9f1ed9e18142cf526f29..550f9ddb63009c02b4e9b11e610fce7118599446 100644 (file)
@@ -138,7 +138,8 @@ namespace SUNDIALS
   }
 
   template <typename VectorType>
-  IDA<VectorType>::IDA(const AdditionalData &data, const MPI_Comm mpi_comm) :
+  IDA<VectorType>::IDA(const AdditionalData &data,
+                       const MPI_Comm mpi_comm) :
     data(data),
     ida_mem(nullptr),
     communicator(Utilities::MPI::duplicate_communicator(mpi_comm))
@@ -151,7 +152,9 @@ namespace SUNDIALS
   {
     if (ida_mem)
       IDAFree(&ida_mem);
+#ifdef DEAL_II_WITH_MPI
     MPI_Comm_free(&communicator);
+#endif
   }
 
 
@@ -162,7 +165,6 @@ namespace SUNDIALS
   {
 
     unsigned int system_size = solution.size();
-    unsigned int local_system_size = system_size;
 
     double t = data.initial_time;
     double h = data.initial_step_size;
@@ -177,8 +179,8 @@ namespace SUNDIALS
 #ifdef DEAL_II_WITH_MPI
     if (is_serial_vector<VectorType>::value == false)
       {
-        IndexSet is = solution.locally_owned_elements();
-        local_system_size = is.n_elements();
+        const IndexSet is = solution.locally_owned_elements();
+        const size_t local_system_size = is.n_elements();
 
         yy        = N_VNew_Parallel(communicator,
                                     local_system_size,
@@ -266,7 +268,6 @@ namespace SUNDIALS
   {
 
     unsigned int system_size;
-    unsigned int local_system_size;
     bool first_step = (current_time == data.initial_time);
 
     if (ida_mem)
@@ -302,8 +303,8 @@ namespace SUNDIALS
 #ifdef DEAL_II_WITH_MPI
     if (is_serial_vector<VectorType>::value == false)
       {
-        IndexSet is = solution.locally_owned_elements();
-        local_system_size = is.n_elements();
+        const IndexSet is = solution.locally_owned_elements();
+        const size_t local_system_size = is.n_elements();
 
         yy        = N_VNew_Parallel(communicator,
                                     local_system_size,

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.