46 #include "Epetra_MpiComm.h"
48 #include "Epetra_SerialComm.h"
50 #include "Epetra_CrsMatrix.h"
51 #include "Epetra_MultiVector.h"
52 #include "Epetra_Vector.h"
53 #include "Epetra_LinearProblem.h"
54 #include "Epetra_Map.h"
55 #include "Galeri_Maps.h"
56 #include "Galeri_CrsMatrices.h"
57 #include "Galeri_Utils.h"
58 #include "Teuchos_ParameterList.hpp"
59 #include "Teuchos_RefCountPtr.hpp"
91 int rb = RowMap.
GID(0);
97 exact_soln.PutScalar(2.0);
102 indices[0]=rb; indices[1]=rb+1;
103 values[0] =2; values[1] =-1;
108 indices[0]=rb; indices[1]=rb+1;
109 values[0] =-1; values[1] =2;
114 indices[0]=rb+1; indices[1]=rb+2; indices[2]=rb+3;
115 values[0] =-1; values[1] = 3; values[2] =-1;
120 indices[0]=rb+2; indices[1]=rb+3; indices[2]=rb+4;
121 values[0] =-1; values[1] = 3; values[2] =-1;
126 indices[0]=rb+3; indices[1]=rb+4;
127 values[0] =-1; values[1] = 2;
132 int PartMap[5]={0,0,1,1,1};
135 ilist.
set(
"partitioner: type",
"user");
136 ilist.
set(
"partitioner: map",&PartMap[0]);
137 ilist.
set(
"partitioner: local parts",2);
138 ilist.
set(
"relaxation: sweeps",1);
139 ilist.
set(
"relaxation: type",
"Gauss-Seidel");
149 lhs.Update(1.0,exact_soln,-1.0);
152 if(
verbose) cout<<
"Variable Block Partitioning Test"<<endl;
155 if(
verbose) cout <<
"Test passed" << endl;
159 if(
verbose) cout <<
"Test failed" << endl;
182 int rb = RowMap.
GID(0);
188 exact_soln.PutScalar(2.0);
193 indices[0]=rb; indices[1]=rb+1;
194 values[0] =2; values[1] =-1;
199 indices[0]=rb; indices[1]=rb+1;
200 values[0] =-1; values[1] =2;
205 indices[0]=rb; indices[1]=rb+1; indices[2]=rb+2; indices[3]=rb+3; indices[4]=rb+4;
206 values[0] =-1; values[1] =-1; values[2] = 5; values[3] =-1; values[4] =-1;
211 indices[0]=rb; indices[1]=rb+1; indices[2]=rb+2; indices[3]=rb+3; indices[4]=rb+4;
212 values[0] =-1; values[1] =-1; values[2] =-1; values[3] = 5; values[4] =-1;
217 indices[0]=rb; indices[1]=rb+1; indices[2]=rb+2; indices[3]=rb+3; indices[4]=rb+4;
218 values[0] =-1; values[1] =-1; values[2] =-1; values[3] =-1; values[4] = 5;
224 int PartMap[5]={0,0,1,1,1};
227 ilist.
set(
"partitioner: type",
"user");
228 ilist.
set(
"partitioner: map",&PartMap[0]);
229 ilist.
set(
"partitioner: local parts",2);
230 ilist.
set(
"relaxation: sweeps",1);
231 ilist.
set(
"relaxation: type",
"Gauss-Seidel");
241 lhs.Update(1.0,exact_soln,-1.0);
244 if(
verbose) cout<<
"Variable Block Partitioning Test"<<endl;
247 if(
verbose) cout <<
"Test passed" << endl;
251 if(
verbose) cout <<
"Test failed" << endl;
261 LHS.PutScalar(0.0);
RHS.Random();
266 List.
set(
"relaxation: damping factor", 1.0);
267 List.
set(
"relaxation: type",
"symmetric Gauss-Seidel");
268 List.
set(
"relaxation: sweeps",1);
269 List.
set(
"partitioner: overlap",0);
270 List.
set(
"partitioner: type",
"line");
271 List.
set(
"partitioner: line detection threshold",0.1);
272 List.
set(
"partitioner: x-coordinates",&(*coord)[0][0]);
273 List.
set(
"partitioner: y-coordinates",&(*coord)[1][0]);
274 List.
set(
"partitioner: z-coordinates",(
double*) 0);
284 AztecOO AztecOOSolver(Problem);
285 AztecOOSolver.SetAztecOption(AZ_solver,
Solver);
287 AztecOOSolver.SetAztecOption(AZ_output,32);
289 AztecOOSolver.SetAztecOption(AZ_output,AZ_none);
290 AztecOOSolver.SetPrecOperator(&Prec);
292 AztecOOSolver.Iterate(2550,1e-5);
294 return(AztecOOSolver.NumIters());
303 LHS.PutScalar(0.0);
RHS.Random();
308 List.
set(
"relaxation: damping factor", 1.0);
309 List.
set(
"relaxation: type",
"symmetric Gauss-Seidel");
310 List.
set(
"relaxation: sweeps",1);
311 List.
set(
"partitioner: overlap",0);
312 List.
set(
"partitioner: type",
"line");
313 List.
set(
"partitioner: line mode",
"matrix entries");
314 List.
set(
"partitioner: line detection threshold",10.0);
324 AztecOO AztecOOSolver(Problem);
325 AztecOOSolver.SetAztecOption(AZ_solver,
Solver);
327 AztecOOSolver.SetAztecOption(AZ_output,32);
329 AztecOOSolver.SetAztecOption(AZ_output,AZ_none);
330 AztecOOSolver.SetPrecOperator(&Prec);
332 AztecOOSolver.Iterate(2550,1e-5);
334 return(AztecOOSolver.NumIters());
342 LHS.PutScalar(0.0);
RHS.Random();
347 List.
set(
"relaxation: damping factor", 1.0);
348 List.
set(
"relaxation: type",
"symmetric Gauss-Seidel");
349 List.
set(
"relaxation: sweeps",1);
350 List.
set(
"partitioner: overlap",0);
351 List.
set(
"partitioner: type",
"line");
352 List.
set(
"partitioner: line detection threshold",1.0);
353 List.
set(
"partitioner: x-coordinates",&(*coord)[0][0]);
354 List.
set(
"partitioner: y-coordinates",&(*coord)[1][0]);
355 List.
set(
"partitioner: z-coordinates",(
double*) 0);
365 AztecOO AztecOOSolver(Problem);
366 AztecOOSolver.SetAztecOption(AZ_solver,
Solver);
368 AztecOOSolver.SetAztecOption(AZ_output,32);
370 AztecOOSolver.SetAztecOption(AZ_output,AZ_none);
371 AztecOOSolver.SetPrecOperator(&Prec);
373 AztecOOSolver.Iterate(2550,1e-5);
375 printf(
" AllSingle iters %d \n",AztecOOSolver.NumIters());
376 return(AztecOOSolver.NumIters());
384 LHS.PutScalar(0.0);
RHS.Random();
389 List.
set(
"relaxation: damping factor", 1.0);
390 List.
set(
"relaxation: type",
"Jacobi");
391 List.
set(
"relaxation: sweeps",1);
392 List.
set(
"partitioner: overlap", Overlap);
393 List.
set(
"partitioner: type",
"linear");
394 List.
set(
"partitioner: local parts", 16);
404 AztecOO AztecOOSolver(Problem);
405 AztecOOSolver.SetAztecOption(AZ_solver,
Solver);
407 AztecOOSolver.SetAztecOption(AZ_output,32);
409 AztecOOSolver.SetAztecOption(AZ_output,AZ_none);
410 AztecOOSolver.SetPrecOperator(&Prec);
412 AztecOOSolver.Iterate(2550,1e-5);
414 return(AztecOOSolver.NumIters());
418 int CompareBlockSizes(std::string PrecType,
const Teuchos::RefCountPtr<Epetra_RowMatrix>&
A,
int NumParts)
422 LHS.PutScalar(0.0);
RHS.Random();
427 List.
set(
"relaxation: damping factor", 1.0);
428 List.
set(
"relaxation: type", PrecType);
429 List.
set(
"relaxation: sweeps",1);
430 List.
set(
"partitioner: type",
"linear");
431 List.
set(
"partitioner: local parts", NumParts);
441 AztecOO AztecOOSolver(Problem);
442 AztecOOSolver.SetAztecOption(AZ_solver,
Solver);
444 AztecOOSolver.SetAztecOption(AZ_output,32);
446 AztecOOSolver.SetAztecOption(AZ_output,AZ_none);
447 AztecOOSolver.SetPrecOperator(&Prec);
449 AztecOOSolver.Iterate(2550,1e-5);
451 return(AztecOOSolver.NumIters());
459 LHS.PutScalar(0.0);
RHS.Random();
465 List.
set(
"relaxation: damping factor", 1.0);
466 List.
set(
"relaxation: type", PrecType);
467 List.
set(
"relaxation: sweeps",sweeps);
468 List.
set(
"partitioner: type",
"linear");
469 List.
set(
"partitioner: local parts", A->NumMyRows());
471 int ItersPoint, ItersBlock;
485 AztecOO AztecOOSolver(Problem);
486 AztecOOSolver.SetAztecOption(AZ_solver,
Solver);
488 AztecOOSolver.SetAztecOption(AZ_output,32);
490 AztecOOSolver.SetAztecOption(AZ_output,AZ_none);
491 AztecOOSolver.SetPrecOperator(&Point);
493 AztecOOSolver.Iterate(2550,1e-2);
495 double TrueResidual = AztecOOSolver.TrueResidual();
496 ItersPoint = AztecOOSolver.NumIters();
499 cout <<
"Iterations = " << ItersPoint << endl;
500 cout <<
"Norm of the true residual = " << TrueResidual << endl;
517 AztecOO AztecOOSolver(Problem);
518 AztecOOSolver.SetAztecOption(AZ_solver,
Solver);
520 AztecOOSolver.SetAztecOption(AZ_output,32);
522 AztecOOSolver.SetAztecOption(AZ_output,AZ_none);
523 AztecOOSolver.SetPrecOperator(&Block);
525 AztecOOSolver.Iterate(2550,1e-2);
527 double TrueResidual = AztecOOSolver.TrueResidual();
528 ItersBlock = AztecOOSolver.NumIters();
531 cout <<
"Iterations " << ItersBlock << endl;
532 cout <<
"Norm of the true residual = " << TrueResidual << endl;
536 int diff = ItersPoint - ItersBlock;
537 if (diff < 0) diff = -diff;
542 cout <<
"ComparePointandBlock TEST FAILED!" << endl;
547 cout <<
"ComparePointandBlock TEST PASSED" << endl;
553 bool KrylovTest(std::string PrecType,
const Teuchos::RefCountPtr<Epetra_RowMatrix>&
A,
bool backward,
bool reorder=
false)
557 LHS.PutScalar(0.0);
RHS.Random();
563 List.
set(
"relaxation: damping factor", 1.0);
564 List.
set(
"relaxation: type", PrecType);
565 if(backward) List.
set(
"relaxation: backward mode",backward);
568 int NumRows=A->NumMyRows();
569 std::vector<int> RowList(NumRows);
571 for(
int i=0; i<NumRows; i++)
573 List.
set(
"relaxation: number of local smoothing indices",NumRows);
574 List.
set(
"relaxation: local smoothing indices",RowList.size()>0? &RowList[0] : (
int*)0);
581 cout <<
"Krylov test: Using " << PrecType
582 <<
" with AztecOO" << endl;
590 List.
set(
"relaxation: sweeps",1);
596 AztecOO AztecOOSolver(Problem);
597 AztecOOSolver.SetAztecOption(AZ_solver,
Solver);
598 AztecOOSolver.SetAztecOption(AZ_output,AZ_none);
599 AztecOOSolver.SetPrecOperator(&Point);
601 AztecOOSolver.Iterate(2550,1e-5);
603 double TrueResidual = AztecOOSolver.TrueResidual();
606 cout <<
"Norm of the true residual = " << TrueResidual << endl;
608 Iters1 = AztecOOSolver.NumIters();
615 List.
set(
"relaxation: sweeps",10);
622 AztecOO AztecOOSolver(Problem);
623 AztecOOSolver.SetAztecOption(AZ_solver,
Solver);
624 AztecOOSolver.SetAztecOption(AZ_output,AZ_none);
625 AztecOOSolver.SetPrecOperator(&Point);
626 AztecOOSolver.Iterate(2550,1e-5);
628 double TrueResidual = AztecOOSolver.TrueResidual();
631 cout <<
"Norm of the true residual = " << TrueResidual << endl;
633 Iters10 = AztecOOSolver.NumIters();
637 cout <<
"Iters_1 = " << Iters1 <<
", Iters_10 = " << Iters10 << endl;
638 cout <<
"(second number should be smaller than first one)" << endl;
641 if (Iters10 > Iters1) {
643 cout <<
"KrylovTest TEST FAILED!" << endl;
648 cout <<
"KrylovTest TEST PASSED" << endl;
654 bool BasicTest(std::string PrecType,
const Teuchos::RefCountPtr<Epetra_RowMatrix>&
A,
bool backward,
bool reorder=
false)
658 LHS.PutScalar(0.0);
RHS.Random();
660 double starting_residual = Galeri::ComputeNorm(&*A, &LHS, &
RHS);
665 List.
set(
"relaxation: damping factor", 1.0);
666 List.
set(
"relaxation: sweeps",2550);
667 List.
set(
"relaxation: type", PrecType);
668 if(backward) List.
set(
"relaxation: backward mode",backward);
671 int NumRows=A->NumMyRows();
672 std::vector<int> RowList(NumRows);
674 for(
int i=0; i<NumRows; i++)
676 List.
set(
"relaxation: number of local smoothing indices",NumRows);
677 List.
set(
"relaxation: local smoothing indices",RowList.size()>0? &RowList[0] : (
int*)0);
689 double residual = Galeri::ComputeNorm(&*A, &LHS, &
RHS);
691 if (A->Comm().MyPID() == 0 &&
verbose)
692 cout <<
"||A * x - b||_2 (scaled) = " << residual / starting_residual << endl;
695 if (residual / starting_residual < 1e-2) {
697 cout <<
"BasicTest Test passed" << endl;
702 cout <<
"BasicTest Test failed!" << endl;
711 int main(
int argc,
char *argv[])
714 MPI_Init(&argc,&argv);
722 for (
int i = 1 ; i < argc ; ++i) {
723 if (strcmp(argv[i],
"-s") == 0) {
732 GaleriList.
set(
"nx", nx);
734 GaleriList.
set(
"mx", 1);
736 Teuchos::RefCountPtr<Epetra_Map> Map =
Teuchos::rcp( Galeri::CreateMap(
"Cartesian2D", Comm, GaleriList) );
737 Teuchos::RefCountPtr<Epetra_CrsMatrix>
A;
739 A =
Teuchos::rcp( Galeri::CreateCrsMatrix(
"Laplace2D", &*Map, GaleriList) );
741 A =
Teuchos::rcp( Galeri::CreateCrsMatrix(
"Recirc2D", &*Map, GaleriList) );
747 int TestPassed =
true;
757 if(!
BasicTest(
"symmetric Gauss-Seidel",A,
false))
760 if(!
BasicTest(
"symmetric Gauss-Seidel",A,
false,
true))
769 if(!
BasicTest(
"Gauss-Seidel",A,
false,
true))
771 if(!
BasicTest(
"Gauss-Seidel",A,
true,
true))
780 if(!
KrylovTest(
"symmetric Gauss-Seidel",A,
false))
783 if(!
KrylovTest(
"symmetric Gauss-Seidel",A,
false,
true))
807 TestPassed = TestPassed &&
813 TestPassed = TestPassed &&
820 TestPassed = TestPassed &&
829 int Iters4, Iters8, Iters16;
834 if ((Iters16 > Iters8) && (Iters8 > Iters4)) {
836 cout <<
"CompareBlockSizes Test passed" << endl;
840 cout <<
"CompareBlockSizes TEST FAILED!" << endl;
841 TestPassed = TestPassed &&
false;
850 int Iters0, Iters2, Iters4;
854 if ((Iters4 < Iters2) && (Iters2 < Iters0)) {
856 cout <<
"CompareBlockOverlap Test passed" << endl;
860 cout <<
"CompareBlockOverlap TEST FAILED!" << endl;
861 TestPassed = TestPassed &&
false;
870 printf(
" comparelinesmoother (coordinate) iters %d \n",Iters1);
879 printf(
" comparelinesmoother (entries) iters %d \n",Iters1);
910 cout <<
"Test `TestRelaxation.exe' failed!" << endl;
919 cout <<
"Test `TestRelaxation.exe' passed!" << endl;
921 return(EXIT_SUCCESS);
int CompareLineSmoother(const Teuchos::RefCountPtr< Epetra_RowMatrix > &A, Teuchos::RCP< Epetra_MultiVector > coord)
Ifpack_BlockRelaxation: a class to define block relaxation preconditioners of Epetra_RowMatrix's.
static bool SymmetricGallery
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
virtual int InsertGlobalValues(int GlobalRow, int NumEntries, const double *Values, const int *Indices)
bool BasicTest(std::string PrecType, const Teuchos::RefCountPtr< Epetra_RowMatrix > &A, bool backward, bool reorder=false)
bool KrylovTest(std::string PrecType, const Teuchos::RefCountPtr< Epetra_RowMatrix > &A, bool backward, bool reorder=false)
virtual int ApplyInverse(const Epetra_MultiVector &X, Epetra_MultiVector &Y) const
Applies the block Jacobi preconditioner to X, returns the result in Y.
virtual int MyPID() const =0
int FillComplete(bool OptimizeDataStorage=true)
virtual int SetParameters(Teuchos::ParameterList &List)
Sets all the parameters for the preconditioner.
bool TestVariableBlocking(const Epetra_Comm &Comm)
virtual const Epetra_Comm & Comm() const =0
virtual int Compute()
Computes the preconditioner.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
int AllSingle(const Teuchos::RefCountPtr< Epetra_RowMatrix > &A, Teuchos::RCP< Epetra_MultiVector > coord)
Ifpack_PointRelaxation: a class to define point relaxation preconditioners of for Epetra_RowMatrix's...
virtual int SetParameters(Teuchos::ParameterList &List)
Sets all the parameters for the preconditioner.
int main(int argc, char *argv[])
virtual int Compute()
Computes the preconditioners.
int CompareLineSmootherEntries(const Teuchos::RefCountPtr< Epetra_RowMatrix > &A)
Epetra_RowMatrix * GetMatrix() const
virtual int Initialize()
Initializes the preconditioner.
int CompareBlockOverlap(const Teuchos::RefCountPtr< Epetra_RowMatrix > &A, int Overlap)
bool TestTriDiVariableBlocking(const Epetra_Comm &Comm)
virtual int ApplyInverse(const Epetra_MultiVector &X, Epetra_MultiVector &Y) const
Applies the preconditioner to X, returns the result in Y.
int CompareBlockSizes(std::string PrecType, const Teuchos::RefCountPtr< Epetra_RowMatrix > &A, int NumParts)