EpetraExt Package Browser (Single Doxygen Collection) Development
test/Copy/cxx_main.cpp
Go to the documentation of this file.
00001 //@HEADER
00002 // ***********************************************************************
00003 //
00004 //     EpetraExt: Epetra Extended - Linear Algebra Services Package
00005 //                 Copyright (2011) Sandia Corporation
00006 //
00007 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
00008 // the U.S. Government retains certain rights in this software.
00009 //
00010 // Redistribution and use in source and binary forms, with or without
00011 // modification, are permitted provided that the following conditions are
00012 // met:
00013 //
00014 // 1. Redistributions of source code must retain the above copyright
00015 // notice, this list of conditions and the following disclaimer.
00016 //
00017 // 2. Redistributions in binary form must reproduce the above copyright
00018 // notice, this list of conditions and the following disclaimer in the
00019 // documentation and/or other materials provided with the distribution.
00020 //
00021 // 3. Neither the name of the Corporation nor the names of the
00022 // contributors may be used to endorse or promote products derived from
00023 // this software without specific prior written permission.
00024 //
00025 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
00026 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00027 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00028 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
00029 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00030 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00031 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00032 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00033 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00034 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00035 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00036 //
00037 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
00038 //
00039 // ***********************************************************************
00040 //@HEADER
00041 
00042 #include "Epetra_Map.h"
00043 #include "Epetra_Time.h"
00044 #include "Epetra_CrsMatrix.h"
00045 #include "Epetra_Vector.h"
00046 #include "Epetra_SerialDenseVector.h"
00047 #include "Epetra_Flops.h"
00048 #ifdef EPETRA_MPI
00049 #include "Epetra_MpiComm.h"
00050 #include "mpi.h"
00051 #else
00052 #include "Epetra_SerialComm.h"
00053 #endif
00054 #include "Epetra_Version.h"
00055 #include "Trilinos_Util_CrsMatrixGallery.h"
00056 #include "EpetraExt_SubCopy_CrsMatrix.h"
00057 using namespace Trilinos_Util;
00058 
00059 // prototypes
00060 
00061 
00062 int main(int argc, char *argv[])
00063 {
00064   int ierr = 0, i, forierr = 0;
00065   bool debug = false;
00066 
00067 #ifdef EPETRA_MPI
00068 
00069   // Initialize MPI
00070 
00071   MPI_Init(&argc,&argv);
00072   int size, rank; // Number of MPI processes, My process ID
00073 
00074   MPI_Comm_size(MPI_COMM_WORLD, &size);
00075   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
00076   Epetra_MpiComm Comm( MPI_COMM_WORLD );
00077 
00078 #else
00079 
00080   int size = 1; // Serial case (not using MPI)
00081   int rank = 0;
00082   Epetra_SerialComm Comm;
00083 
00084 #endif
00085 
00086   bool verbose = false;
00087 
00088   // Check if we should print results to standard out
00089   if (argc>1) if (argv[1][0]=='-' && argv[1][1]=='v') verbose = true;
00090 
00091   //  char tmp;
00092   //  if (rank==0) cout << "Press any key to continue..."<< endl;
00093   //  if (rank==0) cin >> tmp;
00094   //  Comm.Barrier();
00095 
00096   int MyPID = Comm.MyPID();
00097   int NumProc = Comm.NumProc();
00098 
00099   if(verbose && MyPID==0)
00100     cout << Epetra_Version() << endl << endl;
00101 
00102   if (verbose) cout << "Processor "<<MyPID<<" of "<< NumProc
00103         << " is alive."<<endl;
00104 
00105 // Generate Laplace matrix with 4 rows on each processor
00106  CrsMatrixGallery laplace_2d("laplace_2d", Comm);
00107  laplace_2d.Set("problem_size",Comm.NumProc()*Comm.NumProc()*4);
00108  Epetra_CrsMatrix * laplace_2d_matrix = laplace_2d.GetMatrix();
00109  if (verbose) cout << "Orig matrix = " << *laplace_2d_matrix << endl;
00110  const Epetra_Map * origRowMap = laplace_2d.GetMap();
00111  int * origGids = origRowMap->MyGlobalElements();
00112  
00113  // Next generate a sub map of the original problem, taking every other GID.
00114  Epetra_IntSerialDenseVector newRowMapGids(origRowMap->NumMyElements()/2 + 1);
00115  int numNewRowGids = 0;
00116  for (int i=0; i<origRowMap->NumMyElements(); i=i+2)
00117    newRowMapGids[numNewRowGids++] = origGids[i];
00118  Epetra_Map newRowMap(-1, numNewRowGids, newRowMapGids.Values(), 0, origRowMap->Comm());
00119 
00120 
00121  // Use this new map to create a SubCopy transform that we can use on-demand to create submatrices
00122  EpetraExt::CrsMatrix_SubCopy subMatrixTransform(newRowMap);
00123 
00124  // Use the transform we just created to create our submatrix
00125  Epetra_CrsMatrix & subA = subMatrixTransform(*laplace_2d_matrix);
00126  if (verbose) cout << "Sub matrix (every other row/column) = " << subA << endl;
00127 
00128 
00129  // Now test it using the fwd() method to see if changes in the original matrix are carried to the submatrix
00130  (*laplace_2d_matrix)[0][0] = 12.0;
00131  if (verbose) cout << "Orig matrix = " << *laplace_2d_matrix << endl;
00132  subMatrixTransform.fwd();
00133  assert(subA[0][0]==12.0);
00134   if (verbose) cout << "Sub matrix (every other row/column) = " << subA << endl;
00135 
00136 
00137   // Now change the submatrix and use the rvs() method to see if changes are carried to the original matrix
00138  subA[0][0] = 24.0;
00139  if (verbose) cout << "Sub matrix (every other row/column) = " << subA << endl;
00140  subMatrixTransform.rvs();
00141  assert((*laplace_2d_matrix)[0][0]==24.0);
00142  if (verbose) cout << "Orig matrix = " << *laplace_2d_matrix << endl;
00143 
00144  if (Comm.MyPID()==0) cout << "EpetraExt::CrsMatrix_SubCopy tests passed." << endl;
00145 #ifdef EPETRA_MPI
00146   MPI_Finalize() ;
00147 #endif
00148 
00149 return 0;
00150 }
00151 
00152 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines