46 #include "Galeri_Maps.h" 47 #include "Galeri_CrsMatrices.h" 48 #include "Galeri_Utils.h" 49 #include "Epetra_MultiVector.h" 51 #include "Teuchos_UnitTestHarness.hpp" 52 #include "Teuchos_RCP.hpp" 53 #include "Epetra_ConfigDefs.h" 54 #include "Epetra_Vector.h" 55 #include "Epetra_RowMatrix.h" 56 #include "Epetra_MultiVector.h" 57 #include "Epetra_CrsMatrix.h" 58 #include "Epetra_Map.h" 61 #include "Epetra_MpiComm.h" 63 #include "Epetra_SerialComm.h" 68 #include "Teuchos_Array.hpp" 81 Epetra_MpiComm comm(MPI_COMM_WORLD);
82 Epetra_Map RowMap(
N, 0, comm);
83 Epetra_CrsMatrix Matrix(Copy, RowMap, 1);
84 for(
int i = 0; i <
N; i++){
89 Matrix.InsertGlobalValues(i, 1, values, indices);
91 Matrix.FillComplete();
92 Ifpack_Hypre preconditioner(&Matrix);
93 TEST_EQUALITY(preconditioner.Initialize(),0);
100 const double tol = 1e-7;
102 Epetra_MpiComm Comm(MPI_COMM_WORLD);
106 Epetra_CrsMatrix* Matrix;
108 Teuchos::ParameterList GaleriList;
110 int nx = 10 * Comm.NumProc();
111 int ny = 10 * Comm.NumProc();
112 GaleriList.set(
"nx", nx);
113 GaleriList.set(
"ny", ny);
118 Map = Galeri::CreateMap(
"Cartesian2D", Comm, GaleriList);
119 Matrix = Galeri::CreateCrsMatrix(
"Biharmonic2D", Map, GaleriList);
122 Teuchos::ParameterList list(
"Preconditioner List");
123 RCP<FunctionParameter> functs[11];
124 functs[0] = rcp(
new FunctionParameter(
Solver, &HYPRE_PCGSetMaxIter, 1000));
125 functs[1] = rcp(
new FunctionParameter(
Solver, &HYPRE_PCGSetTol,
tol));
126 functs[2] = rcp(
new FunctionParameter(
Solver, &HYPRE_PCGSetTwoNorm, 1));
127 functs[3] = rcp(
new FunctionParameter(
Solver, &HYPRE_PCGSetPrintLevel, 0));
128 functs[4] = rcp(
new FunctionParameter(
Solver, &HYPRE_PCGSetLogging, 1));
129 functs[5] = rcp(
new FunctionParameter(Preconditioner, &HYPRE_BoomerAMGSetPrintLevel, 1));
130 functs[6] = rcp(
new FunctionParameter(Preconditioner, &HYPRE_BoomerAMGSetCoarsenType, 6));
131 functs[7] = rcp(
new FunctionParameter(Preconditioner, &HYPRE_BoomerAMGSetRelaxType, 6));
132 functs[8] = rcp(
new FunctionParameter(Preconditioner, &HYPRE_BoomerAMGSetNumSweeps, 1));
133 functs[9] = rcp(
new FunctionParameter(Preconditioner, &HYPRE_BoomerAMGSetTol, 0.0));
134 functs[10] = rcp(
new FunctionParameter(Preconditioner, &HYPRE_BoomerAMGSetMaxIter, 1));
136 list.set(
"Solver", PCG);
137 list.set(
"Preconditioner", BoomerAMG);
138 list.set(
"SolveOrPrecondition",
Solver);
139 list.set(
"SetPreconditioner",
true);
140 list.set(
"NumFunctions", 11);
141 list.set<RCP<FunctionParameter>*>(
"Functions", functs);
144 Ifpack_Hypre preconditioner(Matrix);
145 TEST_EQUALITY(preconditioner.SetParameters(list),0);
146 TEST_EQUALITY(preconditioner.Compute(),0);
150 Epetra_MultiVector X(preconditioner.OperatorDomainMap(), numVec);
151 Epetra_MultiVector KnownX(preconditioner.OperatorDomainMap(), numVec);
152 TEST_EQUALITY(KnownX.Random(),0);
153 Epetra_MultiVector B(preconditioner.OperatorRangeMap(), numVec);
154 TEST_EQUALITY(preconditioner.Apply(KnownX, B),0);
156 TEST_EQUALITY(preconditioner.ApplyInverse(B,X),0);
163 catch (Galeri::Exception& rhs)
165 if (Comm.MyPID() == 0)
167 cerr <<
"Caught exception: ";
177 const double tol = 1
E-7;
188 RCP<Ifpack_Preconditioner> preconditioner= rcp(Factory.
Create(
"Hypre", Crs_Matrix));
189 TEST_EQUALITY(preconditioner->Initialize(), 0);
190 int NumProc = Crs_Matrix->Comm().NumProc();
191 int MyPID = Crs_Matrix->Comm().MyPID();
197 Epetra_MultiVector X(preconditioner->OperatorRangeMap(), numVec);
198 Epetra_MultiVector KnownX(preconditioner->OperatorRangeMap(), numVec);
199 Epetra_MultiVector B(preconditioner->OperatorDomainMap(), numVec);
200 TEST_EQUALITY(KnownX.Random(), 0);
201 TEST_EQUALITY(preconditioner->Apply(KnownX, B), 0);
203 Teuchos::ParameterList list(
"New List");
204 RCP<FunctionParameter> functs[5];
205 functs[0] = rcp(
new FunctionParameter(
Solver, &HYPRE_PCGSetMaxIter, 1000));
206 functs[1] = rcp(
new FunctionParameter(
Solver, &HYPRE_PCGSetTol, 1e-9));
207 functs[2] = rcp(
new FunctionParameter(
Solver, &HYPRE_PCGSetLogging, 1));
208 functs[3] = rcp(
new FunctionParameter(
Solver, &HYPRE_PCGSetPrintLevel, 0));
209 functs[4] = rcp(
new FunctionParameter(Preconditioner, &HYPRE_ParaSailsSetLogging, 0));
210 list.set(
"NumFunctions", 5);
211 list.set<RCP<FunctionParameter>*>(
"Functions", functs);
212 list.set(
"SolveOrPrecondition",
Solver);
213 list.set(
"Solver", PCG);
214 list.set(
"Preconditioner", ParaSails);
215 list.set(
"SetPreconditioner",
true);
216 TEST_EQUALITY(preconditioner->SetParameters(list), 0);
217 (
dynamic_cast<Ifpack_Hypre*
> (preconditioner.get()))->SetParameter(
Solver, PCG);
218 (
dynamic_cast<Ifpack_Hypre*
> (preconditioner.get()))->SetParameter(Preconditioner, ParaSails);
219 (
dynamic_cast<Ifpack_Hypre*
> (preconditioner.get()))->SetParameter(
Solver, &HYPRE_ParCSRPCGSetMaxIter, 1000);
220 (
dynamic_cast<Ifpack_Hypre*
> (preconditioner.get()))->SetParameter(
Solver, &HYPRE_ParCSRPCGSetTol, 1e-9);
221 (
dynamic_cast<Ifpack_Hypre*
> (preconditioner.get()))->SetParameter(
Solver);
222 (
dynamic_cast<Ifpack_Hypre*
> (preconditioner.get()))->SetParameter(
true);
223 TEST_EQUALITY(preconditioner->Compute(),0);
224 preconditioner->Condest(
Ifpack_Cheap, 1000, 1e-9, Crs_Matrix);
225 TEST_EQUALITY(preconditioner->ApplyInverse(B, X),0);
229 (
dynamic_cast<Ifpack_Hypre*
> (preconditioner.get()))->SetParameter(
Solver, &HYPRE_ParCSRPCGGetNumIterations, &numIters);
230 (
dynamic_cast<Ifpack_Hypre*
> (preconditioner.get()))->SetParameter(
Solver, &HYPRE_ParCSRPCGGetFinalRelativeResidualNorm, &residual);
231 (
dynamic_cast<Ifpack_Hypre*
> (preconditioner.get()))->CallFunctions();
232 if(MyPID == 0) printf(
"It took %d iterations, and achieved %e residual.\n", numIters, residual);
239 Epetra_MpiComm comm(MPI_COMM_WORLD);
240 int numProcs = comm.NumProc();
241 int myRank = comm.MyPID();
246 Epetra_Map accMap(2*numProcs,0,comm);
251 Epetra_CrsMatrix accMat(Copy,accMap,2,
true);
256 accMat.InsertGlobalValues(col,1,&val,&col);
259 accMat.InsertGlobalValues(col,1,&val,&col);
260 accMat.FillComplete();
266 Epetra_MultiVector X(accMap, numVec);
267 Epetra_MultiVector KnownX(accMap, numVec);
269 Epetra_MultiVector B(accMap, numVec);
270 accMat.Apply(KnownX, B);
275 const double tol = 1e-7;
276 Teuchos::ParameterList list(
"Preconditioner List");
277 RCP<FunctionParameter> functs[5];
278 functs[0] = rcp(
new FunctionParameter(
Solver, &HYPRE_PCGSetMaxIter, 100));
279 functs[1] = rcp(
new FunctionParameter(
Solver, &HYPRE_PCGSetTol,
tol));
280 functs[2] = rcp(
new FunctionParameter(
Solver, &HYPRE_PCGSetTwoNorm, 1));
281 functs[3] = rcp(
new FunctionParameter(
Solver, &HYPRE_PCGSetPrintLevel, 2));
282 functs[4] = rcp(
new FunctionParameter(
Solver, &HYPRE_PCGSetLogging, 1));
283 list.set(
"Solver", PCG);
284 list.set(
"SolveOrPrecondition",
Solver);
285 list.set(
"SetPreconditioner",
false);
286 list.set(
"NumFunctions", 5);
287 list.set<RCP<FunctionParameter>*>(
"Functions", functs);
292 Ifpack_Hypre prec(&accMat);
293 TEST_EQUALITY(prec.SetParameters(list),0);
294 TEST_EQUALITY(prec.Compute(),0);
299 TEST_EQUALITY(prec.ApplyInverse(B,X),0);
308 Epetra_MpiComm comm(MPI_COMM_WORLD);
309 int numProcs = comm.NumProc();
310 int myRank = comm.MyPID();
317 elementList[0] = 2*myRank+1;
318 elementList[1] = 2*myRank;
319 Epetra_Map ncMap(2*numProcs,2,elementList,0,comm);
324 Epetra_CrsMatrix accMat(Copy,ncMap,2,
true);
329 accMat.InsertGlobalValues(col,1,&val,&col);
332 accMat.InsertGlobalValues(col,1,&val,&col);
333 accMat.FillComplete();
338 const double tol = 1e-7;
339 Teuchos::ParameterList list(
"Preconditioner List");
340 RCP<FunctionParameter> functs[5];
341 functs[0] = rcp(
new FunctionParameter(
Solver, &HYPRE_PCGSetMaxIter, 100));
342 functs[1] = rcp(
new FunctionParameter(
Solver, &HYPRE_PCGSetTol,
tol));
343 functs[2] = rcp(
new FunctionParameter(
Solver, &HYPRE_PCGSetTwoNorm, 1));
344 functs[3] = rcp(
new FunctionParameter(
Solver, &HYPRE_PCGSetPrintLevel, 2));
345 functs[4] = rcp(
new FunctionParameter(
Solver, &HYPRE_PCGSetLogging, 1));
346 list.set(
"Solver", PCG);
347 list.set(
"SolveOrPrecondition",
Solver);
348 list.set(
"SetPreconditioner",
false);
349 list.set(
"NumFunctions", 5);
350 list.set<RCP<FunctionParameter>*>(
"Functions", functs);
355 Ifpack_Hypre prec(&accMat);
356 TEST_EQUALITY(prec.SetParameters(list),0);
357 TEST_EQUALITY(prec.Compute(),0);
364 Epetra_MultiVector X(ncMap, numVec);
365 Epetra_MultiVector KnownX(ncMap, numVec);
367 Epetra_MultiVector B(ncMap, numVec);
368 accMat.Apply(KnownX, B);
374 TEST_EQUALITY(prec.ApplyInverse(B,X),-1);
386 Epetra_MpiComm comm(MPI_COMM_WORLD);
387 int numProcs = comm.NumProc();
388 int myRank = comm.MyPID();
394 elementList[0] = myRank;
395 elementList[1] = myRank+numProcs;
396 Epetra_Map badMap(2*numProcs,2,elementList,0,comm);
397 Epetra_Map goodMap(2*numProcs,0,comm);
402 Epetra_CrsMatrix badMat(Copy,badMap,2,
true);
406 badMat.InsertGlobalValues(col,1,&val,&col);
407 col = myRank+numProcs;
408 badMat.InsertGlobalValues(col,1,&val,&col);
409 badMat.FillComplete();
414 const double tol = 1e-7;
415 Teuchos::ParameterList list(
"Preconditioner List");
416 RCP<FunctionParameter> functs[11];
417 functs[0] = rcp(
new FunctionParameter(
Solver, &HYPRE_PCGSetMaxIter, 1));
418 functs[1] = rcp(
new FunctionParameter(
Solver, &HYPRE_PCGSetTol,
tol));
419 functs[2] = rcp(
new FunctionParameter(
Solver, &HYPRE_PCGSetTwoNorm, 1));
420 functs[3] = rcp(
new FunctionParameter(
Solver, &HYPRE_PCGSetPrintLevel, 2));
421 functs[4] = rcp(
new FunctionParameter(
Solver, &HYPRE_PCGSetLogging, 1));
422 list.set(
"Solver", PCG);
423 list.set(
"SolveOrPrecondition",
Solver);
424 list.set(
"SetPreconditioner",
false);
425 list.set(
"NumFunctions", 5);
426 list.set<RCP<FunctionParameter>*>(
"Functions", functs);
431 Ifpack_Hypre prec(&badMat);
432 TEST_EQUALITY(prec.SetParameters(list),0);
433 TEST_EQUALITY(prec.Compute(),0);
439 Epetra_MultiVector X(goodMap, numVec);
440 Epetra_MultiVector
RHS(goodMap, numVec);
446 TEST_EQUALITY(prec.ApplyInverse(
RHS,X),0);
bool EquivalentVectors(Epetra_MultiVector &Y1, Epetra_MultiVector &Y2, const double tol)
TEUCHOS_UNIT_TEST(Ifpack_Hypre, Construct)
static Ifpack_Preconditioner * Create(EPrecType PrecType, Epetra_RowMatrix *Matrix, const int overlap=0, bool overrideSerialDefault=false)
Creates an instance of Ifpack_Preconditioner given the enum value of the preconditioner type (can not...
Epetra_CrsMatrix * newCrsMatrix(int N)