From: turcksin Date: Wed, 27 Mar 2013 21:58:09 +0000 (+0000) Subject: Merge from mainline. X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0175ab989f23907fd8ab79c983f962fe0c622f8a;p=dealii-svn.git Merge from mainline. git-svn-id: https://svn.dealii.org/branches/branch_bigger_global_dof_indices_4@29091 0785d39b-7218-0410-832d-ea1e28bc413d --- 0175ab989f23907fd8ab79c983f962fe0c622f8a diff --cc deal.II/include/deal.II/lac/trilinos_vector_base.h index 5414e00d1f,134bc47064..51d06b880a --- a/deal.II/include/deal.II/lac/trilinos_vector_base.h +++ b/deal.II/include/deal.II/lac/trilinos_vector_base.h @@@ -192,11 -187,15 +192,15 @@@ namespace TrilinosWrapper * Exception */ DeclException3 (ExcAccessToNonLocalElement, - int, int, int, + size_type, size_type, size_type, << "You tried to access element " << arg1 - << " of a distributed vector, but only elements " + << " of a distributed vector, but it is not stored on " + << "the current processor. Note: the elements stored " + << "on the current processor are within the range " << arg2 << " through " << arg3 - << " are stored locally and can be accessed."); + << " but Trilinos vectors need not store contiguous " + << "ranges on each processor, and not every element in " + << "this range may in fact be stored locally."); private: /** @@@ -489,18 -488,36 +493,36 @@@ * that is stored locally. If * this is a sequential vector, * then the result will be the - * pair (0,N), otherwise it will - * be a pair (i,i+n), where - * n=local_size(). + * pair (0,N), otherwise it will + * be a pair (i,i+n), where + * n=local_size() and i is the first + * element of the vector stored on this processor, corresponding + * to the half open interval $[i,i+n)$ + * + * @note The description above is true most of the time, but + * not always. In particular, Trilinos vectors need not store + * contiguous ranges of elements such as $[i,i+n)$. Rather, it + * can store vectors where the elements are distributed in + * an arbitrary way across all processors and each processor + * simply stores a particular subset, not necessarily contiguous. + * In this case, this function clearly makes no sense since it + * could, at best, return a range that includes all elements + * that are stored locally. Thus, the function only succeeds + * if the locally stored range is indeed contiguous. It will + * trigger an assertion if the local portion of the vector + * is not contiguous. */ - std::pair local_range () const; + std::pair local_range () const; /** * Return whether @p index is in * the local range or not, see * also local_range(). + * + * @note The same limitation for the applicability of this + * function applies as listed in the documentation of local_range(). */ - bool in_local_range (const unsigned int index) const; + bool in_local_range (const size_type index) const; /** * Return if the vector contains ghost @@@ -1488,17 -1502,18 +1510,26 @@@ inline - std::pair + std::pair VectorBase::local_range () const { - int begin, end; + TrilinosWrappers::types::int_type begin, end; +#ifndef DEAL_II_USE_LARGE_INDEX_TYPE begin = vector->Map().MinMyGID(); end = vector->Map().MaxMyGID()+1; ++<<<<<<< .working +#else + begin = vector->Map().MinMyGID64(); + end = vector->Map().MaxMyGID64()+1; +#endif ++======= + + Assert (end-begin == vector->Map().NumMyElements(), + ExcMessage ("This function only makes sense if the elements that this " + "vector stores on the current processor form a contiguous range. " + "This does not appear to be the case for the current vector.")); + ++>>>>>>> .merge-right.r29088 return std::make_pair (begin, end); } diff --cc tests/petsc/52.cc index f305e6bcea,d307922191..71cebb2908 --- a/tests/petsc/52.cc +++ b/tests/petsc/52.cc @@@ -60,11 -60,9 +60,11 @@@ int main (int argc,char **argv try { - PetscInitialize(&argc,&argv,0,0); + Utilities::MPI::MPI_InitFinalize mpi_initialization(argc, argv, 1); { - std::vector row_lengths (5, 3U); + typedef PETScWrappers::SparseMatrix::size_type size_type; + + std::vector row_lengths (5, 3U); row_lengths.back() = 2; PETScWrappers::SparseMatrix m (5,5,row_lengths); test (m);