44 #include <Epetra_LinearProblem.h> 45 #include <Epetra_CrsMatrix.h> 46 #include <Epetra_Vector.h> 53 int lsize = (int) lScaleVecs_.size();
54 for(
int i = 0; i < lsize; ++i )
55 delete lScaleVecs_[i];
56 int rsize = (int) rScaleVecs_.size();
57 for(
int i = 0; i < rsize; ++i )
58 delete rScaleVecs_[i];
65 Epetra_CrsMatrix & Matrix = *(
dynamic_cast<Epetra_CrsMatrix*
>(
origObj_->GetMatrix()));
67 const Epetra_BlockMap & RHSMap =
origObj_->GetRHS()->Map();
68 const Epetra_BlockMap & LHSMap =
origObj_->GetLHS()->Map();
72 if( lScale_ !=
None && !lScaleVecs_.size() )
74 lScaleVecs_.resize(iters_);
75 for(
int i = 0; i < iters_; ++i )
76 lScaleVecs_[i] =
new Epetra_Vector( RHSMap );
78 if( rScale_ !=
None && !rScaleVecs_.size() )
80 rScaleVecs_.resize(iters_);
81 for(
int i = 0; i < iters_; ++i )
82 rScaleVecs_[i] =
new Epetra_Vector( LHSMap );
85 for(
int i = 0; i < iters_; ++i )
91 case Max: Matrix.InvRowMaxs( *(lScaleVecs_[i]) );
93 case Sum: Matrix.InvRowSums( *(lScaleVecs_[i]) );
95 case Diag: Matrix.ExtractDiagonalCopy( *(lScaleVecs_[i]) );
96 lScaleVecs_[i]->Reciprocal( *(lScaleVecs_[i]) );
102 int numVals = RHSMap.NumMyPoints();
103 for(
int j = 0; j < numVals; ++j ) (*(lScaleVecs_[i]))[j] = pow( (*(lScaleVecs_[i]))[j], expFac_ );
105 newObj_->LeftScale( *lScaleVecs_[i] );
107 if( rScale_ !=
None )
111 case Max: Matrix.InvColMaxs( *(rScaleVecs_[i]) );
113 case Sum: Matrix.InvColSums( *(rScaleVecs_[i]) );
115 case Diag: Matrix.ExtractDiagonalCopy( *(rScaleVecs_[i]) );
116 rScaleVecs_[i]->Reciprocal( *(rScaleVecs_[i]) );
122 int numVals = LHSMap.NumMyPoints();
123 for(
int j = 0; j < numVals; ++j ) (*(rScaleVecs_[i]))[j] = pow( (*(rScaleVecs_[i]))[j], expFac_ );
125 newObj_->RightScale( *rScaleVecs_[i] );
139 if( !scaled_ ) std::cout <<
"EpetraExt::LinearProblem_Scale::rvs() : Problem Not Scaled!\n";
143 for(
int i = 0; i < iters_; ++i )
145 int loc = iters_-i-1;
146 if( rScale_ !=
None )
148 rScaleVecs_[loc]->Reciprocal( *(rScaleVecs_[loc]) );
149 newObj_->RightScale( *(rScaleVecs_[loc]) );
151 if( lScale_ !=
None )
153 lScaleVecs_[loc]->Reciprocal( *(lScaleVecs_[loc]) );
154 newObj_->LeftScale( *(lScaleVecs_[loc]) );
EpetraExt::BlockCrsMatrix: A class for constructing a distributed block matrix.
bool fwd()
Applies forward scaling.
bool rvs()
Reverses scaling.
~LinearProblem_Scale()
Destructor.