From: David Wells Date: Sat, 16 Sep 2017 18:00:30 +0000 (-0400) Subject: Make the SUNDIALS vector copy more generic. X-Git-Tag: v9.0.0-rc1~1069^2~2 X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cbd94df4332952c70cbf9809d45d20af2fe50397;p=dealii.git Make the SUNDIALS vector copy more generic. --- diff --git a/source/sundials/copy.cc b/source/sundials/copy.cc index bf4e3c7ab2..27c554d063 100644 --- a/source/sundials/copy.cc +++ b/source/sundials/copy.cc @@ -1,15 +1,15 @@ //----------------------------------------------------------- // -// Copyright (C) 2015 by the deal.II authors +// Copyright (C) 2017 by the deal.II authors // -// This file is part of the deal.II library. +// This file is part of the deal.II library. // -// The deal.II library is free software; you can use it, redistribute -// it, and/or modify it under the terms of the GNU Lesser General -// Public License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. -// The full text of the license can be found in the file LICENSE at -// the top level of the deal.II distribution. +// The deal.II library is free software; you can use it, redistribute +// it, and/or modify it under the terms of the GNU Lesser General +// Public License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// The full text of the license can be found in the file LICENSE at +// the top level of the deal.II distribution. // //----------------------------------------------------------- @@ -22,6 +22,41 @@ namespace SUNDIALS { namespace internal { + namespace + { + /** + * SUNDIALS provides different macros for getting the local length of a + * vector for serial and parallel vectors (as well as various parallel + * vectors that are not yet supported by deal.II). This function provides + * a generic interface to both and does a (checked) conversion from long + * int (the type SUNDIALS uses for lengths) to std::size_t. + */ + inline + std::size_t + N_Vector_length(const N_Vector &vec) + { + const N_Vector_ID id = N_VGetVectorID(vec); + long int length = -1; + switch (id) + { + case SUNDIALS_NVEC_SERIAL: + { + length = NV_LENGTH_S(vec); + break; + } + case SUNDIALS_NVEC_PARALLEL: + { + length = NV_LOCLENGTH_P(vec); + break; + } + default: + Assert(false, ExcNotImplemented()); + } + + Assert(length >= 0, ExcInternalError()); + return static_cast(length); + } + } #ifdef DEAL_II_WITH_MPI @@ -31,7 +66,7 @@ namespace SUNDIALS void copy(TrilinosWrappers::MPI::Vector &dst, const N_Vector &src) { IndexSet is = dst.locally_owned_elements(); - AssertDimension(is.n_elements(), NV_LOCLENGTH_P(src)); + AssertDimension(is.n_elements(), N_Vector_length(src)); for (unsigned int i=0; i &dst, const N_Vector &src) { - AssertDimension((unsigned int)NV_LENGTH_S(src), dst.size()); + AssertDimension(N_Vector_length(src), dst.size()); for (unsigned int i=0; i &src) { - AssertDimension((unsigned int)NV_LENGTH_S(dst), src.size()); + AssertDimension(N_Vector_length(dst), src.size()); for (unsigned int i=0; i &dst, const N_Vector &src) { - AssertDimension((unsigned int)NV_LENGTH_S(src), dst.size()); + AssertDimension(N_Vector_length(src), dst.size()); for (unsigned int i=0; i &src) { - AssertDimension((unsigned int)NV_LENGTH_S(dst), src.size()); + AssertDimension(N_Vector_length(dst), src.size()); for (unsigned int i=0; i