39
42
//-----------------------------------------------------------------------------
40
43
dolfin::uint EpetraKrylovSolver::solve(const EpetraMatrix& A, EpetraVector& x, const EpetraVector& b) {
41
44
//FIXME need the ifdef AztecOO
50
#ifdef HAVE_ML_AZTECOO
43
51
// create linear system
44
Epetra_LinearProblem linear_system(&(A.mat()),&(x.vec()),&(b.vec()));
45
// create AztecOO instance
46
AztecOO linear_solver(linear_system);
48
linear_solver.SetAztecOption( AZ_solver, AZ_gmres);
52
// Code from trilinos-8.0.3/packages/didasko/examples/ml/ex1.cpp
54
// Create and set an ML multilevel preconditioner
57
// Maximum number of levels
61
// ML_Set_PrintLevel(3);
63
ML_Create(&ml_handle,N_levels);
65
// wrap Epetra Matrix into ML matrix (data is NOT copied)
66
EpetraMatrix2MLMatrix(ml_handle, 0, &(A.mat()));
68
// create a ML_Aggregate object to store the aggregates
69
ML_Aggregate *agg_object;
70
ML_Aggregate_Create(&agg_object);
72
// specify max coarse size
73
ML_Aggregate_Set_MaxCoarseSize(agg_object,1);
75
// generate the hierady
76
N_levels = ML_Gen_MGHierarchy_UsingAggregation(ml_handle, 0, ML_INCREASING, agg_object);
78
// Set a symmetric Gauss-Seidel smoother for the MG method
79
ML_Gen_Smoother_SymGaussSeidel(ml_handle, ML_ALL_LEVELS, ML_BOTH, 1, ML_DEFAULT);
82
ML_Gen_Solver(ml_handle, ML_MGV, 0, N_levels-1);
84
// wrap ML_Operator into Epetra_Operator
85
ML_Epetra::MultiLevelOperator MLop(ml_handle,A.mat().Comm(),A.mat().DomainMap(),A.mat().RangeMap());
87
// set this operator as preconditioner for AztecOO
88
linear_solver.SetPrecOperator(&MLop);
90
linear_solver.Iterate(1000,1E-9);
52
Epetra_LinearProblem linear_system(&(A.mat()),&(x.vec()),&(b.vec()));
53
// create AztecOO instance
54
AztecOO linear_solver(linear_system);
56
linear_solver.SetAztecOption( AZ_solver, AZ_gmres);
60
// Code from trilinos-8.0.3/packages/didasko/examples/ml/ex1.cpp
62
// Create and set an ML multilevel preconditioner
65
// Maximum number of levels
69
// ML_Set_PrintLevel(3);
71
ML_Create(&ml_handle,N_levels);
73
// wrap Epetra Matrix into ML matrix (data is NOT copied)
74
EpetraMatrix2MLMatrix(ml_handle, 0, &(A.mat()));
76
// create a ML_Aggregate object to store the aggregates
77
ML_Aggregate *agg_object;
78
ML_Aggregate_Create(&agg_object);
80
// specify max coarse size
81
ML_Aggregate_Set_MaxCoarseSize(agg_object,1);
83
// generate the hierady
84
N_levels = ML_Gen_MGHierarchy_UsingAggregation(ml_handle, 0, ML_INCREASING, agg_object);
86
// Set a symmetric Gauss-Seidel smoother for the MG method
87
ML_Gen_Smoother_SymGaussSeidel(ml_handle, ML_ALL_LEVELS, ML_BOTH, 1, ML_DEFAULT);
90
ML_Gen_Solver(ml_handle, ML_MGV, 0, N_levels-1);
92
// wrap ML_Operator into Epetra_Operator
93
ML_Epetra::MultiLevelOperator MLop(ml_handle,A.mat().Comm(),A.mat().DomainMap(),A.mat().RangeMap());
95
// set this operator as preconditioner for AztecOO
96
linear_solver.SetPrecOperator(&MLop);
98
linear_solver.Iterate(1000,1E-9);
100
error("EpetraKrylovSolver::solve not compiled with ML support.");
103
error("EpetraKrylovSolver::solve only AMG preconditioner implemented.");
94
107
//-----------------------------------------------------------------------------