EpetraExt Package Browser (Single Doxygen Collection) Development
test/Composite/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 // Transform_Composite Test routine
00043 
00044 #include <EpetraExt_ConfigDefs.h>
00045 #include "EpetraExt_Version.h"
00046 
00047 #include "Epetra_SerialComm.h"
00048 #include "Epetra_Time.h"
00049 
00050 #ifdef EPETRA_MPI
00051 #include "Epetra_MpiComm.h"
00052 #include <mpi.h>
00053 #endif
00054 
00055 #include "Epetra_Map.h"
00056 #include "Epetra_CrsGraph.h"
00057 #include "Epetra_CrsMatrix.h"
00058 #include "Epetra_Vector.h"
00059 #include "Epetra_LinearProblem.h"
00060 
00061 #include "EpetraExt_Transform_Composite.h"
00062 #include "EpetraExt_LPTrans_From_GraphTrans.h"
00063 #include "EpetraExt_SymmRCM_CrsGraph.h"
00064 #include "EpetraExt_Reindex_LinearProblem.h"
00065 //#include "EpetraExt_CrsSingletonFilter_LinearProblem.h"
00066 
00067 #ifdef EPETRA_MPI
00068 #include "EpetraExt_Overlap_CrsGraph.h"
00069 #endif
00070 
00071 #include "../epetra_test_err.h"
00072 
00073 int main(int argc, char *argv[]) {
00074 
00075   int i, ierr=0, returnierr=0;
00076 
00077 #ifdef EPETRA_MPI
00078 
00079   // Initialize MPI
00080 
00081   MPI_Init(&argc,&argv);
00082   int size, rank; // Number of MPI processes, My process ID
00083 
00084   MPI_Comm_size(MPI_COMM_WORLD, &size);
00085   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
00086 
00087 #else
00088 
00089   int size = 1; // Serial case (not using MPI)
00090   int rank = 0;
00091 
00092 #endif
00093 
00094   bool verbose = false;
00095 
00096   // Check if we should print results to standard out
00097   if (argc>1) if (argv[1][0]=='-' && argv[1][1]=='v') verbose = true;
00098 
00099 
00100 #ifdef EPETRA_MPI
00101   Epetra_MpiComm Comm(MPI_COMM_WORLD);
00102 #else
00103   Epetra_SerialComm Comm;
00104 #endif
00105   if (!verbose) Comm.SetTracebackMode(0); // This should shut down any error traceback reporting
00106 
00107   int MyPID = Comm.MyPID();
00108   int NumProc = Comm.NumProc();
00109 
00110   bool verbose1 = verbose;
00111   if( verbose ) verbose = (MyPID==0);
00112 
00113   if ( verbose )
00114     cout << EpetraExt::EpetraExt_Version() << endl << endl;
00115 
00116   Comm.Barrier();
00117 
00118   if( verbose1 ) cout << Comm << endl << flush;
00119 
00120   int NumMyElements = 3;
00121   int NumGlobalElements = NumProc*NumMyElements;
00122   int IndexBase = 0;
00123   
00124   Epetra_Map Map( NumGlobalElements, NumMyElements, 0, Comm );
00125   if( verbose1 ) cout << Map << endl << flush;
00126 
00127   Epetra_CrsGraph Graph( Copy, Map, 1 );
00128 
00129   int PIDFac = 10*MyPID;
00130   int index = PIDFac+2;
00131   Graph.InsertGlobalIndices( PIDFac+0, 1, &index );
00132   index = PIDFac+0;
00133   Graph.InsertGlobalIndices( PIDFac+1, 1, &index );
00134   index = PIDFac+1;
00135   Graph.InsertGlobalIndices( PIDFac+2, 1, &index );
00136 
00137   Graph.FillComplete();
00138   if( verbose1 ) cout << Graph << endl << flush;
00139 
00140   EpetraExt::Transform_Composite<Epetra_LinearProblem> CompTrans;
00141 
00142 //  EpetraExt::LinearProblem_CrsSingletonFilter CSF_LPTrans;
00143 //  EpetraExt::SameTypeTransform<Epetra_LinearProblem> * CSF_LPTransPtr = &CSF_LPTrans;
00144 //  CompTrans.addTransform( CSF_LPTransPtr );
00145 
00146   EpetraExt::LinearProblem_Reindex * RI_Trans = new EpetraExt::LinearProblem_Reindex(0);
00147   EpetraExt::SameTypeTransform<Epetra_LinearProblem> * RI_LPTrans = RI_Trans;
00148   CompTrans.addTransform( RI_LPTrans );
00149 
00150   EpetraExt::CrsGraph_SymmRCM RCM_Trans;
00151   EpetraExt::SameTypeTransform<Epetra_LinearProblem> *
00152         RCM_LPTrans = new EpetraExt::LinearProblem_GraphTrans( RCM_Trans );
00153   CompTrans.addTransform( RCM_LPTrans );
00154 
00155 #ifdef EPETRA_MPI
00156   EpetraExt::CrsGraph_Overlap Overlap_Trans(1);
00157   EpetraExt::SameTypeTransform<Epetra_LinearProblem> *
00158         Overlap_LPTrans = new EpetraExt::LinearProblem_GraphTrans( Overlap_Trans );
00159   CompTrans.addTransform( Overlap_LPTrans );
00160 #endif
00161 
00162   Epetra_CrsMatrix Matrix( Copy, Graph );
00163   index = 2;
00164   double val = 2;
00165   Matrix.ReplaceMyValues( 0, 1, &val, &index );
00166   index = 0;
00167   val = 0;
00168   Matrix.ReplaceMyValues( 1, 1, &val, &index );
00169   index = 1;
00170   val = 1;
00171   Matrix.ReplaceMyValues( 2, 1, &val, &index);
00172 
00173   vector<double> valA(3);
00174   valA[0]=0; valA[1]=1; valA[2]=2;
00175   Epetra_BlockMap & MapRef = Map;
00176   Epetra_Vector LHS( Copy, MapRef, &valA[0] );
00177   Epetra_Vector RHS( Copy, MapRef, &valA[0] );
00178 
00179   Epetra_LinearProblem Prob( &Matrix, &LHS, &RHS );
00180 
00181   Epetra_LinearProblem & NewProb = CompTrans( Prob );
00182 
00183   CompTrans.fwd();
00184   CompTrans.rvs();
00185 
00186 #ifdef EPETRA_MPI
00187   MPI_Finalize();
00188 #endif
00189 
00190   return ierr;
00191 }
00192 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines