Hello everyone,
I have implemented a residual-minimization framework that somehow is
similar to DPG. I want to extend my results by using parallelization using
MPI with PETSc or Trilinos.
So far, I have solved the saddle point problem using the Schur complement
exactly how it is described in step 20. Now, I am trying to replicate
exactly the same solver but using the MPI wrappers and the linear operators.
The problem is that when I am trying to implement the inverse_operator to
compute the Preconditioner of the Schur complement, I get an error saying
that the functions are not matching "inverse_operator(op_aS, solver_aS,
TrilinosWrappers::PreconditionIdentity())."
There is no much documentation about linear operators in parallel solvers,
so if anyone has any suggestion on how to fix this problem, it would be
well appreciated.
I have pasted the complete function in below:
template <int dim>
void FEMwDG<dim>::
solve()
{
TimerOutput::Scope t(computing_timer, "solve");
LA::MPI::PreconditionJacobi prec_M;
LA::MPI::PreconditionJacobi::AdditionalData data;
prec_M.initialize(system_matrix.block(0, 0), data);
}
auto &E = solution.block(0);
auto &U = solution.block(1);
const auto &L = system_rhs.block(0);
const auto M = linear_operator<LA::MPI::Vector>(system_matrix.block(0,
0));
const auto op_M = linear_operator(M, prec_M);
const auto op_B =
linear_operator<LA::MPI::Vector>(system_matrix.block(0, 1));
const auto op_BT =
linear_operator<LA::MPI::Vector>(system_matrix.block(1, 0));
ReductionControl inner_solver_control2(5000,
1e-18 *
system_rhs.l2_norm(),
1.e-2);
SolverCG<LA::MPI::Vector> cg(inner_solver_control2);
const auto op_M_inv = inverse_operator(M, cg, prec_M);
const auto op_S = op_BT * op_M_inv * op_B;
const auto op_aS = op_BT * linear_operator<LA::MPI::Vector>(prec_M) *
op_B;
IterationNumberControl iteration_number_control_aS(30, 1.e-18);
SolverCG<LA::MPI::Vector> solver_aS(iteration_number_control_aS);
const auto preconditioner_S =
inverse_operator(op_aS, solver_aS,
TrilinosWrappers::PreconditionIdentity());
const auto schur_rhs = op_BT * op_M_inv * L ;
SolverControl solver_control_S(2000, 1.e-12);
SolverCG<LA::MPI::Vector> solver_S(solver_control_S);
const auto op_S_inv = inverse_operator(op_S, solver_S, preconditioner_S
);
U = op_S_inv * schur_rhs;
std::cout << solver_control_S.last_step()
<< " CG Schur complement iterations to obtain convergence."
<< std::endl;
E = op_M_inv * (L - op_B * U);
}
Thank you so much,
Regards,
Felipe
--
The deal.II project is located at http://www.dealii.org/
For mailing list/forum options, see
https://groups.google.com/d/forum/dealii?hl=en
---
You received this message because you are subscribed to the Google Groups
"deal.II User Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/dealii/40b8db07-5243-4603-825b-9e7850580206n%40googlegroups.com.