26 #include "Komplex_LinearProblem.h"
32 template<
typename Scalar>
33 AztecOOSolver<Scalar>::AztecOOSolver(EpetraMatrix<Scalar> *m, EpetraVector<Scalar> *rhs)
34 : IterSolver<Scalar>(), m(m), rhs(rhs)
39 template<
typename Scalar>
40 AztecOOSolver<Scalar>::~AztecOOSolver()
44 template<
typename Scalar>
45 void AztecOOSolver<Scalar>::set_solver(
const char *name)
50 if(strcasecmp(name,
"gmres") == 0) az_solver = AZ_gmres;
51 else if(strcasecmp(name,
"cg") == 0) az_solver = AZ_cg;
52 else if(strcasecmp(name,
"cgs") == 0) az_solver = AZ_cgs;
53 else if(strcasecmp(name,
"tfqmr") == 0) az_solver = AZ_tfqmr;
54 else if(strcasecmp(name,
"bicgstab") == 0) az_solver = AZ_bicgstab;
55 else az_solver = AZ_gmres;
62 aztec.SetAztecOption(AZ_solver, az_solver);
65 template<
typename Scalar>
66 void AztecOOSolver<Scalar>::set_tolerance(
double tol)
68 this->tolerance = tol;
71 template<
typename Scalar>
72 void AztecOOSolver<Scalar>::set_max_iters(
int iters)
74 this->max_iters = iters;
77 template<
typename Scalar>
79 void AztecOOSolver<Scalar>::set_precond(Precond<Scalar> *pc)
81 this->precond_yes =
true;
85 template<
typename Scalar>
86 void AztecOOSolver<Scalar>::set_precond(
const char *name)
91 if(strcasecmp(name,
"none") == 0)
93 else if(strcasecmp(name,
"jacobi") == 0)
94 az_precond = AZ_Jacobi;
95 else if(strcasecmp(name,
"neumann") == 0)
96 az_precond = AZ_Neumann;
97 else if(strcasecmp(name,
"least-squares") == 0)
100 az_precond = AZ_none;
103 az_precond = AZ_none;
105 this->precond_yes = (az_precond != AZ_none);
106 aztec.SetAztecOption(AZ_precond, az_precond);
109 template<
typename Scalar>
110 void AztecOOSolver<Scalar>::set_option(
int option,
int value)
112 aztec.SetAztecOption(option, value);
115 template<
typename Scalar>
116 void AztecOOSolver<Scalar>::set_param(
int param,
double value)
118 aztec.SetAztecParam(param, value);
121 template<
typename Scalar>
122 int AztecOOSolver<Scalar>::get_matrix_size()
128 bool AztecOOSolver<double>::solve()
132 assert(m->size == rhs->size);
135 aztec.SetAztecOption(AZ_output, AZ_none);
138 aztec.SetUserMatrix(m->mat);
139 aztec.SetRHS(rhs->vec);
140 Epetra_Vector x(*rhs->std_map);
145 Epetra_Operator *op = pc->get_obj();
147 aztec.SetPrecOperator(op);
151 aztec.Iterate(this->max_iters, this->tolerance);
154 this->time = this->accumulated();
157 this->sln =
new double[m->size];
158 memset(this->sln, 0, m->size *
sizeof(
double));
161 for (
unsigned int i = 0; i < m->size; i++) this->sln[i] = x[i];
166 bool AztecOOSolver<std::complex<double> >::solve()
170 assert(m->size == rhs->size);
173 aztec.SetAztecOption(AZ_output, AZ_none);
175 double c0r = 1.0, c0i = 0.0;
176 double c1r = 0.0, c1i = 1.0;
178 Epetra_Vector xr(*rhs->std_map);
179 Epetra_Vector xi(*rhs->std_map);
181 Komplex_LinearProblem kp(c0r, c0i, *m->mat, c1r, c1i, *m->mat_im, xr, xi, *rhs->vec, *rhs->vec_im);
182 Epetra_LinearProblem *lp = kp.KomplexProblem();
183 aztec.SetProblem(*lp,
true);
186 aztec.Iterate(this->max_iters, this->tolerance);
188 kp.ExtractSolution(xr, xi);
191 this->sln =
new std::complex<double>[m->size];
192 memset(this->sln, 0, m->size *
sizeof(std::complex<double>));
195 for (
unsigned int i = 0; i < m->size; i++) this->sln[i] = std::complex<double>(xr[i], xi[i]);
199 template<
typename Scalar>
200 int AztecOOSolver<Scalar>::get_num_iters()
202 return aztec.NumIters();
205 template<
typename Scalar>
206 double AztecOOSolver<Scalar>::get_residual()
208 return aztec.TrueResidual();
211 template class HERMES_API AztecOOSolver<double>;
212 template class HERMES_API AztecOOSolver<std::complex<double> >;