Epetra Package Browser (Single Doxygen Collection) Development
Epetra_DistObject.h
Go to the documentation of this file.
00001 /*
00002 //@HEADER
00003 // ************************************************************************
00004 // 
00005 //               Epetra: Linear Algebra Services Package 
00006 //                 Copyright 2011 Sandia Corporation
00007 // 
00008 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
00009 // the U.S. Government retains certain rights in this software.
00010 //
00011 // Redistribution and use in source and binary forms, with or without
00012 // modification, are permitted provided that the following conditions are
00013 // met:
00014 //
00015 // 1. Redistributions of source code must retain the above copyright
00016 // notice, this list of conditions and the following disclaimer.
00017 //
00018 // 2. Redistributions in binary form must reproduce the above copyright
00019 // notice, this list of conditions and the following disclaimer in the
00020 // documentation and/or other materials provided with the distribution.
00021 //
00022 // 3. Neither the name of the Corporation nor the names of the
00023 // contributors may be used to endorse or promote products derived from
00024 // this software without specific prior written permission.
00025 //
00026 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
00027 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00028 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00029 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
00030 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00031 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00032 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00033 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00034 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00035 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00036 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00037 //
00038 // Questions? Contact Michael A. Heroux (maherou@sandia.gov) 
00039 // 
00040 // ************************************************************************
00041 //@HEADER
00042 */
00043 
00044 #ifndef EPETRA_DISTOBJECT_H
00045 #define EPETRA_DISTOBJECT_H
00046 #include "Epetra_ConfigDefs.h"
00047 #include "Epetra_Object.h"
00048 #include "Epetra_SrcDistObject.h"
00049 #include "Epetra_BlockMap.h"
00050 class Epetra_Comm;
00051 class Epetra_Import;
00052 class Epetra_Export;
00053 class Epetra_Distributor;
00054 class Epetra_OffsetIndex;
00055 
00057 
00079 //==========================================================================
00080 class EPETRA_LIB_DLL_EXPORT Epetra_DistObject: public Epetra_Object, public virtual Epetra_SrcDistObject {
00081 
00082   public:
00084 
00085 
00086 
00098   Epetra_DistObject(const Epetra_BlockMap& Map);
00099 
00114   Epetra_DistObject(const Epetra_BlockMap& Map, const char* const Label);
00115 
00117   
00118   Epetra_DistObject(const Epetra_DistObject& Source);
00119   
00120   
00122   virtual ~Epetra_DistObject();
00124 
00126 
00127 
00129 
00141   int Import(const Epetra_SrcDistObject& A, const Epetra_Import& Importer, Epetra_CombineMode CombineMode, const Epetra_OffsetIndex * Indexor = 0);
00142 
00144 
00156   int Import(const Epetra_SrcDistObject& A, const Epetra_Export& Exporter, Epetra_CombineMode CombineMode, const Epetra_OffsetIndex * Indexor = 0);
00157 
00159 
00171   int Export(const Epetra_SrcDistObject& A, const Epetra_Import & Importer, Epetra_CombineMode CombineMode, const Epetra_OffsetIndex * Indexor = 0);
00172 
00174 
00186   int Export(const Epetra_SrcDistObject& A, const Epetra_Export& Exporter, Epetra_CombineMode CombineMode, const Epetra_OffsetIndex * Indexor = 0);
00188   
00190 
00191 
00192   const Epetra_BlockMap& Map() const {return(Map_);};
00193 
00195   const Epetra_Comm& Comm() const {return(*Comm_);};
00196 
00198   bool DistributedGlobal() const {return(DistributedGlobal_);};
00200 
00202 
00203 
00204   virtual void Print(std::ostream& os) const;
00206 
00207  protected:
00208 
00209 
00211 
00212 
00213   virtual int DoTransfer(const Epetra_SrcDistObject& A,
00214                          Epetra_CombineMode CombineMode,
00215                          int NumSameIDs,
00216                          int NumPermuteIDs,
00217                          int NumRemoteIDs,
00218                          int NumExportIDs, 
00219                          int* PermuteToLIDs,
00220                          int* PermuteFromLIDs,
00221                          int* RemoteLIDs,
00222                          int* ExportLIDs,
00223                          int& LenExports,
00224                          char*& Exports,
00225                          int& LenImports, 
00226                          char*& Imports,
00227                          Epetra_Distributor& Distor,
00228                          bool DoReverse,
00229                          const Epetra_OffsetIndex * Indexor );
00231 
00232   // These methods must be implemented by derived class
00233 
00235 
00236 
00237   virtual int CheckSizes(const Epetra_SrcDistObject& Source) = 0;
00239   virtual int CopyAndPermute(const Epetra_SrcDistObject& Source,
00240                              int NumSameIDs, 
00241                              int NumPermuteIDs,
00242                              int * PermuteToLIDs,
00243                              int * PermuteFromLIDs,
00244                              const Epetra_OffsetIndex * Indexor) = 0;
00245 
00247   virtual int PackAndPrepare(const Epetra_SrcDistObject& Source,
00248                              int NumExportIDs,
00249                              int* ExportLIDs,
00250                              int& LenExports,
00251                              char*& Exports,
00252                              int& SizeOfPacket,
00253                              int* Sizes,
00254                              bool & VarSizes,
00255                              Epetra_Distributor& Distor) = 0;
00256   
00258   virtual int UnpackAndCombine(const Epetra_SrcDistObject& Source, 
00259                                int NumImportIDs,
00260                                int* ImportLIDs, 
00261                                int LenImports,
00262                                char* Imports,
00263                                int& SizeOfPacket, 
00264                                Epetra_Distributor& Distor,
00265                                Epetra_CombineMode CombineMode,
00266                                const Epetra_OffsetIndex * Indexor) = 0;
00267 
00269   Epetra_BlockMap Map_;
00270   const Epetra_Comm* Comm_;
00271   bool DistributedGlobal_;
00272   char* Exports_;
00273   char* Imports_;
00274   int LenExports_;
00275   int LenImports_;
00276   int *Sizes_;
00277 
00278  private:
00279   Epetra_DistObject& operator=(const Epetra_DistObject& src);
00280 
00281 };
00282 
00283 #endif /* EPETRA_DISTOBJECT_H */
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines