EpetraExt Package Browser (Single Doxygen Collection) Development
EpetraExt_Reindex_CrsMatrix.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 <EpetraExt_Reindex_CrsMatrix.h>
00043 
00044 #include <vector>
00045 
00046 #include <Epetra_CrsMatrix.h>
00047 #include <Epetra_Map.h>
00048 #include <Epetra_IntVector.h>
00049 
00050 #include <Epetra_Export.h>
00051 #include <Epetra_Import.h>
00052 
00053 namespace EpetraExt {
00054 
00055 CrsMatrix_Reindex::
00056 ~CrsMatrix_Reindex()
00057 {
00058   if( newObj_ ) delete newObj_;
00059   if( NewColMap_ ) delete NewColMap_;
00060 }
00061 
00062 CrsMatrix_Reindex::NewTypeRef
00063 CrsMatrix_Reindex::
00064 operator()( OriginalTypeRef orig )
00065 {
00066   origObj_ = &orig;
00067 
00068   //test std::map, must have same number of local and global elements as original row std::map
00069   Epetra_Map & OldRowMap = const_cast<Epetra_Map&>(orig.RowMap());
00070   Epetra_Map & OldColMap = const_cast<Epetra_Map&>(orig.ColMap());
00071   int NumMyElements = OldRowMap.NumMyElements();
00072   assert( OldRowMap.NumMyElements() == NewRowMap_.NumMyElements() );
00073 
00074   //Construct new Column Map
00075   Epetra_IntVector Cols( OldRowMap );
00076   Epetra_IntVector NewCols( OldColMap );
00077   Epetra_Import Importer( OldColMap, OldRowMap );
00078 
00079   for( int i = 0; i < NumMyElements; ++i )
00080     Cols[i] = NewRowMap_.GID(i);
00081 
00082   NewCols.Import( Cols, Importer, Insert );
00083 
00084   std::vector<int*> NewColIndices(1);
00085   NewCols.ExtractView( &NewColIndices[0] );
00086 
00087   int NumMyColElements = OldColMap.NumMyElements();
00088   int NumGlobalColElements = OldColMap.NumGlobalElements();
00089 
00090   NewColMap_ = new Epetra_Map( NumGlobalColElements, NumMyColElements, NewColIndices[0], OldColMap.IndexBase(), OldColMap.Comm() );
00091 
00092   //intial construction of matrix 
00093   Epetra_CrsMatrix * NewMatrix = new Epetra_CrsMatrix( View, NewRowMap_, *NewColMap_, 0 );
00094 
00095   //insert views of row values
00096   int * myIndices;
00097   double * myValues;
00098   int indicesCnt;
00099   int numMyRows = NewMatrix->NumMyRows();
00100   for( int i = 0; i < numMyRows; ++i )
00101   {
00102     orig.ExtractMyRowView( i, indicesCnt, myValues, myIndices );
00103     NewMatrix->InsertMyValues( i, indicesCnt, myValues, myIndices );
00104   }
00105 
00106   NewMatrix->FillComplete();
00107 
00108   newObj_ = NewMatrix;
00109 
00110   return *NewMatrix;
00111 }
00112 
00113 } // namespace EpetraExt
00114 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines