//@HEADER /* ************************************************************************ Epetra: Linear Algebra Services Package Copyright (2001) Sandia Corporation Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive license for use of this work by or on behalf of the U.S. Government. This library is free software; you can 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. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Questions? Contact Michael A. Heroux (maherou@sandia.gov) ************************************************************************ */ //@HEADER #ifndef EPETRA_INTVECTOR_H #define EPETRA_INTVECTOR_H #include "Epetra_DistObject.h" #include "Epetra_BlockMap.h" #include "Epetra_Distributor.h" class Epetra_Map; //! Epetra_IntVector: A class for constructing and using dense integer vectors on a parallel computer. /*! The Epetra_IntVector class enables the construction and use of integer dense vectors in a distributed memory environment. The distribution of the dense vector is determined in part by a Epetra_Comm object and a Epetra_Map (or Epetra_LocalMap or Epetra_BlockMap). Distributed Global vs. Replicated Local Constructing Epetra_IntVectors There are four Epetra_IntVector constructors. The first is a basic constructor that allocates space and sets all values to zero, the second is a copy constructor. The third and fourth constructors work with user data. These constructors have two data access modes:
  1. Copy mode - Allocates memory and makes a copy of the user-provided data. In this case, the user data is not needed after construction.
  2. View mode - Creates a "view" of the user data. In this case, the user data is required to remain intact for the life of the vector.
\warning View mode is \e extremely dangerous from a data hiding perspective. Therefore, we strongly encourage users to develop code using Copy mode first and only use the View mode in a secondary optimization phase. All Epetra_IntVector constructors require a map argument that describes the layout of elements on the parallel machine. Specifically, \c map is a Epetra_Map, Epetra_LocalMap or Epetra_BlockMap object describing the desired memory layout for the vector. There are four different Epetra_IntVector constructors: Extracting Data from Epetra_IntVectors Once a Epetra_IntVector is constructed, it is possible to extract a copy of the values or create a view of them. \warning ExtractView functions are \e extremely dangerous from a data hiding perspective. For both ExtractView fuctions, there is a corresponding ExtractCopy function. We strongly encourage users to develop code using ExtractCopy functions first and only use the ExtractView functions in a secondary optimization phase. There are two Extract functions: \warning A Epetra_Map, Epetra_LocalMap or Epetra_BlockMap object is required for all Epetra_IntVector constructors. */ //========================================================================= class Epetra_IntVector : public Epetra_DistObject { public: //! @name Constructors/destructors //@{ //! Basic Epetra_IntVector constuctor. /*! Creates a Epetra_IntVector object and, by default, fills with zero values. \param In Map - A Epetra_LocalMap, Epetra_Map or Epetra_BlockMap. \warning Note that, because Epetra_LocalMap derives from Epetra_Map and Epetra_Map derives from Epetra_BlockMap, this constructor works for all three types of Epetra map classes. \param In zeroOut - If true then the allocated memory will be zeroed out initialy. If false then this memory will not be touched which can be significantly faster. \return Pointer to a Epetra_IntVector. */ Epetra_IntVector(const Epetra_BlockMap& Map, bool zeroOut = true); //! Epetra_IntVector copy constructor. Epetra_IntVector(const Epetra_IntVector& Source); //! Set vector values from user array. /*! \param In Epetra_DataAccess - Enumerated type set to Copy or View. \param In Map - A Epetra_LocalMap, Epetra_Map or Epetra_BlockMap. \param In V - Pointer to an array of integer numbers.. \return Integer error code, set to 0 if successful. See Detailed Description section for further discussion. */ Epetra_IntVector(Epetra_DataAccess CV, const Epetra_BlockMap& Map, int *V); //! Epetra_IntVector destructor. virtual ~Epetra_IntVector (); //@} //! @name Post-construction modification methods //@{ //! Set all elements of the vector to Value int PutValue(int Value); //@} //! @name Extraction methods //@{ //! Put vector values into user-provided array. /*! \param Out V - Pointer to memory space that will contain the vector values. \return Integer error code, set to 0 if successful. */ int ExtractCopy(int *V) const; //! Set user-provided address of V. /*! \param Out V - Address of a pointer to that will be set to point to the values of the vector. \return Integer error code, set to 0 if successful. */ int ExtractView(int **V) const; //@} //! @name Mathematical methods //@{ //! Find maximum value /*! \return Maximum value across all processors. */ int MaxValue(); //! Find minimum value /*! \return Minimum value across all processors. */ int MinValue(); //@} //! @name Overloaded operators //@{ //! = Operator. /*! \param In A - Epetra_IntVector to copy. \return Epetra_IntVector. */ Epetra_IntVector& operator = (const Epetra_IntVector& Source); //! Element access function. /*! \return V[Index]. */ int& operator [] (int index) { return Values_[index]; } //! Element access function. /*! \return V[Index]. */ const int& operator [] (int index) const { return Values_[index]; } //@} //! @name Attribute access functions //@{ //! Returns a pointer to an array containing the values of this vector. int * Values() const {return(Values_);}; //! Returns the local vector length on the calling processor of vectors in the multi-vector. int MyLength() const {return(Map().NumMyPoints());}; //! Returns the global vector length of vectors in the multi-vector. int GlobalLength() const {return(Map().NumGlobalPoints());}; //@} //! @name I/O methods //@{ //! Print method virtual void Print(ostream & os) const; //@} private: int AllocateForCopy(); int DoCopy(int * V); int AllocateForView(); int DoView(int * V); // Routines to implement Epetra_DistObject virtual methods int CheckSizes(const Epetra_SrcDistObject& A); int CopyAndPermute(const Epetra_SrcDistObject & Source, int NumSameIDs, int NumPermuteIDs, int * PermuteToLIDs, int * PermuteFromLIDs, const Epetra_OffsetIndex * Indexor); int PackAndPrepare(const Epetra_SrcDistObject & Source, int NumExportIDs, int * ExportLIDs, int & LenExports, char * & Exports, int & SizeOfPacket, int * Sizes, bool& VarSizes, Epetra_Distributor & Distor); int UnpackAndCombine(const Epetra_SrcDistObject & Source, int NumImportIDs, int * ImportLIDs, int LenImports, char * Imports, int & SizeOfPacket, Epetra_Distributor & Distor, Epetra_CombineMode CombineMode, const Epetra_OffsetIndex * Indexor); int * Values_; bool UserAllocated_; bool Allocated_; }; #endif /* EPETRA_INTVECTOR_H */