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
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #include "Ifpack_OverlapGraph.h"
00044 #include "Epetra_CrsGraph.h"
00045 #include "Epetra_RowMatrix.h"
00046 #include "Epetra_BlockMap.h"
00047 #include "Epetra_Map.h"
00048
00049 #include <Teuchos_ParameterList.hpp>
00050 #include <ifp_parameters.h>
00051
00052
00053 Ifpack_OverlapGraph::Ifpack_OverlapGraph(const Teuchos::RefCountPtr<const Epetra_CrsGraph>& UserMatrixGraph_in, int OverlapLevel_in)
00054 : UserMatrixGraph_(UserMatrixGraph_in),
00055 OverlapLevel_(OverlapLevel_in)
00056 {
00057
00058 IsOverlapped_ = (OverlapLevel_in>0 && UserMatrixGraph_in->DomainMap().DistributedGlobal());
00059
00060 ConstructOverlapGraph(UserMatrixGraph_in);
00061
00062 }
00063
00064 Ifpack_OverlapGraph::Ifpack_OverlapGraph(const Teuchos::RefCountPtr<const Epetra_RowMatrix>& UserMatrix_in, int OverlapLevel_in)
00065 : UserMatrix_(UserMatrix_in),
00066 OverlapLevel_(OverlapLevel_in)
00067 {
00068
00069 IsOverlapped_ = (OverlapLevel_in>0 && UserMatrix_in->OperatorDomainMap().DistributedGlobal());
00070
00071 throw ReportError("This constructor is not implemented yet. Need to add Epetra_SrcObject support to Epetra_Import/Export", -1);
00072 }
00073
00074 Ifpack_OverlapGraph::Ifpack_OverlapGraph(const Ifpack_OverlapGraph & Source)
00075 : OverlapGraph_(Source.OverlapGraph_),
00076 UserMatrixGraph_(Source.UserMatrixGraph_),
00077 UserMatrix_(Source.UserMatrix_),
00078 OverlapRowMap_(Source.OverlapRowMap_),
00079 OverlapLevel_(Source.OverlapLevel_),
00080 IsOverlapped_(Source.IsOverlapped_)
00081 {
00082 if (IsOverlapped_) {
00083 if (OverlapGraph_!=Teuchos::null) OverlapGraph_ = Teuchos::rcp( new Epetra_CrsGraph(*OverlapGraph_) );
00084 if (OverlapRowMap_!=Teuchos::null) OverlapRowMap_ = Teuchos::rcp( new Epetra_BlockMap(*OverlapRowMap_) );
00085 }
00086
00087 }
00088
00089
00090 int Ifpack_OverlapGraph::SetParameters(const Teuchos::ParameterList& parameterlist,
00091 bool cerr_warning_if_unused)
00092 {
00093 Ifpack::param_struct params;
00094 params.int_params[Ifpack::level_overlap-FIRST_INT_PARAM] = OverlapLevel_;
00095
00096 Ifpack::set_parameters(parameterlist, params, cerr_warning_if_unused);
00097
00098 OverlapLevel_ = params.int_params[Ifpack::level_overlap-FIRST_INT_PARAM];
00099 return(0);
00100 }
00101
00102
00103 int Ifpack_OverlapGraph::ConstructOverlapGraph(const Teuchos::RefCountPtr<const Epetra_CrsGraph>& UserMatrixGraph) {
00104
00105 if (!IsOverlapped_) {
00106 OverlapGraph_ = Teuchos::rcp_const_cast<Epetra_CrsGraph>( UserMatrixGraph );
00107 OverlapRowMap_ = Teuchos::rcp( (Epetra_BlockMap *) &UserMatrixGraph->RowMap(), false );
00108 return(0);
00109 }
00110
00111 Teuchos::RefCountPtr<Epetra_CrsGraph> OldGraph;
00112 Teuchos::RefCountPtr<Epetra_BlockMap> OldRowMap;
00113 const Epetra_BlockMap DomainMap = UserMatrixGraph->DomainMap();
00114 const Epetra_BlockMap RangeMap = UserMatrixGraph->RangeMap();
00115
00116 for (int level=1; level <= OverlapLevel_; level++) {
00117 OldGraph = OverlapGraph_;
00118 OldRowMap = OverlapRowMap_;
00119
00120 OverlapImporter_ = Teuchos::rcp( (Epetra_Import *) OldGraph->Importer(), false );
00121 OverlapRowMap_ = Teuchos::rcp( new Epetra_BlockMap(OverlapImporter_->TargetMap()) );
00122
00123 if (level<OverlapLevel_)
00124 OverlapGraph_ = Teuchos::rcp( new Epetra_CrsGraph(Copy, *OverlapRowMap_, 0) );
00125 else
00126
00127
00128 OverlapGraph_ = Teuchos::rcp( new Epetra_CrsGraph(Copy, *OverlapRowMap_, *OverlapRowMap_, 0) );
00129
00130 EPETRA_CHK_ERR(OverlapGraph_->Import( *UserMatrixGraph, *OverlapImporter_, Insert));
00131 if (level<OverlapLevel_) {
00132 EPETRA_CHK_ERR(OverlapGraph_->FillComplete(DomainMap, RangeMap));
00133 }
00134 else {
00135
00136 OverlapImporter_ = Teuchos::rcp( new Epetra_Import(*OverlapRowMap_, DomainMap) );
00137 EPETRA_CHK_ERR(OverlapGraph_->FillComplete(DomainMap, RangeMap));
00138 }
00139
00140 }
00141
00142 return(0);
00143 }
00144