00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include <EpetraExt_Reindex_LinearProblem.h>
00030
00031 #include <EpetraExt_Reindex_CrsMatrix.h>
00032 #include <EpetraExt_Reindex_MultiVector.h>
00033
00034 #include <Epetra_LinearProblem.h>
00035 #include <Epetra_CrsMatrix.h>
00036 #include <Epetra_MultiVector.h>
00037 #include <Epetra_Map.h>
00038
00039 namespace EpetraExt {
00040
00041 LinearProblem_Reindex::
00042 ~LinearProblem_Reindex()
00043 {
00044 if( newObj_ ) delete newObj_;
00045
00046 if( MatTrans_ ) delete MatTrans_;
00047 if( LHSTrans_ ) delete LHSTrans_;
00048 if( RHSTrans_ ) delete RHSTrans_;
00049
00050 if( NewRowMapOwned_ ) delete NewRowMap_;
00051 }
00052
00053 LinearProblem_Reindex::NewTypeRef
00054 LinearProblem_Reindex::
00055 operator()( OriginalTypeRef orig )
00056 {
00057 Epetra_CrsMatrix * OldMatrix = dynamic_cast<Epetra_CrsMatrix*>( orig.GetMatrix() );
00058 Epetra_MultiVector * OldRHS = orig.GetRHS();
00059 Epetra_MultiVector * OldLHS = orig.GetLHS();
00060 const Epetra_BlockMap & OldRowMap = OldMatrix->Map();
00061
00062
00063 if( !NewRowMap_ )
00064 {
00065 int NumMyElements = OldRowMap.NumMyElements();
00066 int NumGlobalElements = OldRowMap.NumGlobalElements();
00067
00068 NewRowMap_ = new Epetra_Map( NumGlobalElements, NumMyElements, 0, OldRowMap.Comm() );
00069 NewRowMapOwned_ = true;
00070 }
00071
00072 MatTrans_ = new CrsMatrix_Reindex( *NewRowMap_ );
00073 LHSTrans_ = new MultiVector_Reindex( *NewRowMap_ );
00074 RHSTrans_ = new MultiVector_Reindex( *NewRowMap_ );
00075
00076 Epetra_CrsMatrix * NewMatrix = &((*MatTrans_)( *OldMatrix ));
00077 Epetra_MultiVector * NewLHS = &((*LHSTrans_)( *OldLHS ));
00078 Epetra_MultiVector * NewRHS = &((*RHSTrans_)( *OldRHS ));
00079
00080 newObj_ = new Epetra_LinearProblem( NewMatrix, NewLHS, NewRHS );
00081
00082 return *newObj_;
00083 }
00084
00085 }
00086