61 #include "Trilinos_Util.h"
62 #include "Ifpack_IlukGraph.h"
63 #include "Ifpack_CrsRiluk.h"
79 double Tolerance,
bool verbose);
86 int main(
int argc,
char *argv[]) {
89 MPI_Init(&argc,&argv);
97 int MyPID = Comm.
MyPID();
100 if (MyPID==0) verbose =
true;
103 if (verbose) cerr <<
"Usage: " << argv[0] <<
" HB_data_file" << endl;
116 Trilinos_Util_ReadHb2Epetra(argv[1], Comm, readMap, readA, readx, readb, readxexact);
123 #ifdef EPETRA_MPI // If running in parallel, we need to distribute matrix across all PEs.
139 #else // If not running in parallel, we do not need to distribute the matrix
152 double totalFlops = counter.
Flops();
153 double MFLOPS = totalFlops/elapsedTime/1000000.0;
157 <<
"*************************************************" << endl
158 <<
" Approximate smallest eigenvalue = " << lambda << endl
159 <<
" Total Time = " << elapsedTime << endl
160 <<
" Total FLOPS = " << totalFlops << endl
161 <<
" Total MFLOPS = " << MFLOPS << endl
162 <<
"*************************************************" << endl;
195 resid.SetFlopCounter(A);
202 double normz, residual;
205 double tolerance = 1.0E-6;
208 for (
int iter = 0; iter < niters; iter++)
212 <<
" ***** Performing step " << iter <<
" of inverse iteration ***** " << endl;
215 q.Scale(1.0/normz, z);
218 if (iter%10==0 || iter+1==niters)
220 resid.Update(1.0, z, -lambda, q, 0.0);
221 resid.Norm2(&residual);
223 <<
"***** Inverse Iteration Step " << iter+1 << endl
224 <<
" Lambda = " << 1.0/lambda << endl
225 <<
" Residual of A(inv)*q - lambda*q = "
228 if (residual < tolerance) {
238 resid.Update(1.0, z, -lambda, q, 0.0);
239 resid.Norm2(&residual);
240 cout <<
" Explicitly computed residual of A*q - lambda*q = " << residual << endl;
249 Ifpack_IlukGraph * IlukGraph =
new Ifpack_IlukGraph(A.
Graph(), LevelFill, Overlap);
250 assert(IlukGraph->ConstructFilledGraph()==0);
251 M =
new Ifpack_CrsRiluk(A, *IlukGraph);
252 M->SetFlopCounter(A);
253 assert(M->InitValues()==0);
254 assert(M->Factor()==0);
267 double Tolerance = 1.0E-16;
268 BiCGSTAB(A, x, b, M, Maxiter, Tolerance, verbose);
279 Ifpack_IlukGraph & IlukGraph = (Ifpack_IlukGraph &) M->Graph();
294 double Tolerance,
bool verbose) {
308 r.Update(1.0, b, -1.0);
310 double r_norm, b_norm, scaled_r_norm, rhon, rhonm1 = 1.0;
311 double alpha = 1.0, omega = 1.0, sigma;
312 double omega_num, omega_den;
315 scaled_r_norm = r_norm/b_norm;
318 if (verbose) cout <<
"Initial residual = " << r_norm
319 <<
" Scaled residual = " << scaled_r_norm << endl;
322 for (
int i=0; i<Maxiter; i++) {
324 double beta = (rhon/rhonm1) * (alpha/omega);
331 double dtemp = - beta*omega;
333 p.Update(1.0, r, dtemp, v, beta);
337 M->Solve(
false, p, phat);
341 rtilde.Dot(v,&sigma);
348 s.Update(-alpha, v, 1.0, r, 0.0);
352 M->Solve(
false, s, shat);
355 r.Dot(s, &omega_num);
356 r.Dot(r, &omega_den);
357 omega = omega_num / omega_den;
362 x.
Update(alpha, phat, omega, shat, 1.0);
363 r.Update(1.0, s, -omega);
366 scaled_r_norm = r_norm/b_norm;
369 if (verbose) cout <<
"Iter "<< i <<
" residual = " << r_norm
370 <<
" Scaled residual = " << scaled_r_norm << endl;
372 if (scaled_r_norm < Tolerance)
break;
void SetFlopCounter(const Epetra_Flops &FlopCounter_in)
Set the internal Epetra_Flops() pointer.
int NumGlobalElements() const
Number of elements across all processors.
Epetra_Map: A class for partitioning vectors and matrices.
int Random()
Set multi-vector values to random numbers.
int Multiply(bool TransA, const Epetra_Vector &x, Epetra_Vector &y) const
Returns the result of a Epetra_CrsMatrix multiplied by a Epetra_Vector x in y.
double ElapsedTime(void) const
Epetra_Time elapsed time function.
void BiCGSTAB(Epetra_CrsMatrix &A, Epetra_Vector &x, Epetra_Vector &b, Ifpack_CrsRiluk *M, int Maxiter, double Tolerance, bool verbose)
Epetra_Export: This class builds an export object for efficient exporting of off-processor elements...
Epetra_Vector: A class for constructing and using dense vectors on a parallel computer.
int MyPID() const
Return my process ID.
Epetra_MpiComm: The Epetra MPI Communication Class.
int FillComplete(bool OptimizeDataStorage=true)
Signal that data entry is complete. Perform transformations to local index space. ...
Epetra_Time: The Epetra Timing Class.
const Epetra_Map & RowMap() const
Returns the Epetra_Map object associated with the rows of this matrix.
int applyInverse(Epetra_CrsMatrix &A, Epetra_Vector &x, Epetra_Vector &b, Ifpack_CrsRiluk *M, bool verbose)
int Export(const Epetra_SrcDistObject &A, const Epetra_Import &Importer, Epetra_CombineMode CombineMode, const Epetra_OffsetIndex *Indexor=0)
Exports an Epetra_DistObject using the Epetra_Import object.
int applyInverseDestroy(Ifpack_CrsRiluk *M)
Epetra_SerialComm: The Epetra Serial Communication Class.
Epetra_Flops: The Epetra Floating Point Operations Class.
double Flops() const
Returns the number of floating point operations with this object and resets the count.
int Update(double ScalarA, const Epetra_MultiVector &A, double ScalarThis)
Update multi-vector values with scaled values of A, this = ScalarThis*this + ScalarA*A.
Epetra_CrsMatrix: A class for constructing and using real-valued double-precision sparse compressed r...
int invIteration(Epetra_CrsMatrix &A, double &lambda, bool verbose)
int Norm2(double *Result) const
Compute 2-norm of each vector in multi-vector.
int main(int argc, char *argv[])
int applyInverseSetup(Epetra_CrsMatrix &A, Ifpack_CrsRiluk *&M)
const Epetra_CrsGraph & Graph() const
Returns a reference to the Epetra_CrsGraph object associated with this matrix.
Epetra_Flops * GetFlopCounter() const
Get the pointer to the Epetra_Flops() object associated with this object, returns 0 if none...
const Epetra_BlockMap & Map() const
Returns the address of the Epetra_BlockMap for this multi-vector.