[cig-commits] [commit] master: log number of inner iterations in Stokes preconditioner (7638523)
cig_noreply at geodynamics.org
cig_noreply at geodynamics.org
Wed May 28 08:19:54 PDT 2014
Repository : https://github.com/geodynamics/aspect
On branch : master
Link : https://github.com/geodynamics/aspect/compare/434a201f7bdf0ba46f41240cc9b8451e0266593f...873554bd6cd5a6f643a0bc66c9d25e67650822a7
>---------------------------------------------------------------
commit 7638523b37525f60a29e172f4d2c5efa4740e87e
Author: Timo Heister <timo.heister at gmail.com>
Date: Wed May 28 10:22:23 2014 -0400
log number of inner iterations in Stokes preconditioner
>---------------------------------------------------------------
7638523b37525f60a29e172f4d2c5efa4740e87e
source/simulator/solver.cc | 49 +++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 44 insertions(+), 5 deletions(-)
diff --git a/source/simulator/solver.cc b/source/simulator/solver.cc
index b43bd22..c7382de 100644
--- a/source/simulator/solver.cc
+++ b/source/simulator/solver.cc
@@ -201,6 +201,9 @@ namespace aspect
void vmult (LinearAlgebra::BlockVector &dst,
const LinearAlgebra::BlockVector &src) const;
+ unsigned int n_iterations_A() const;
+ unsigned int n_iterations_S() const;
+
private:
/**
* References to the various matrix object this preconditioner works on.
@@ -215,6 +218,8 @@ namespace aspect
* or to just apply a single preconditioner step with it.
**/
const bool do_solve_A;
+ mutable unsigned int n_iterations_A_;
+ mutable unsigned int n_iterations_S_;
};
@@ -230,9 +235,26 @@ namespace aspect
stokes_preconditioner_matrix (Spre),
mp_preconditioner (Mppreconditioner),
a_preconditioner (Apreconditioner),
- do_solve_A (do_solve_A)
+ do_solve_A (do_solve_A),
+ n_iterations_A_(0),
+ n_iterations_S_(0)
{}
+ template <class PreconditionerA, class PreconditionerMp>
+ unsigned int
+ BlockSchurPreconditioner<PreconditionerA, PreconditionerMp>::
+ n_iterations_A() const
+ {
+ return n_iterations_A_;
+ }
+ template <class PreconditionerA, class PreconditionerMp>
+ unsigned int
+ BlockSchurPreconditioner<PreconditionerA, PreconditionerMp>::
+ n_iterations_S() const
+ {
+ return n_iterations_S_;
+ }
+
template <class PreconditionerA, class PreconditionerMp>
void
@@ -257,9 +279,12 @@ namespace aspect
// iterating. We simply skip
// solving in this case.
if (src.block(1).l2_norm() > 1e-50 || dst.block(1).l2_norm() > 1e-50)
- solver.solve(stokes_preconditioner_matrix.block(1,1),
- dst.block(1), src.block(1),
- mp_preconditioner);
+ {
+ solver.solve(stokes_preconditioner_matrix.block(1,1),
+ dst.block(1), src.block(1),
+ mp_preconditioner);
+ n_iterations_S_ += solver_control.last_step();
+ }
dst.block(1) *= -1.0;
}
@@ -280,9 +305,13 @@ namespace aspect
#endif
solver.solve(stokes_matrix.block(0,0), dst.block(0), utmp,
a_preconditioner);
+ n_iterations_A_ += solver_control.last_step();
}
else
+ {
a_preconditioner.vmult (dst.block(0), utmp);
+ n_iterations_A_ += 1;
+ }
}
}
@@ -483,6 +512,7 @@ namespace aspect
SolverControl solver_control_expensive (system_matrix.block(block_vel,block_p).m() +
system_matrix.block(block_p,block_vel).m(), solver_tolerance);
+ unsigned int its_A = 0, its_S = 0;
try
{
// if this cheaper solver is not desired, then simply short-cut
@@ -504,6 +534,9 @@ namespace aspect
AdditionalData(30, true));
solver.solve(stokes_block, distributed_stokes_solution,
distributed_stokes_rhs, preconditioner);
+
+ its_A += preconditioner.n_iterations_A();
+ its_S += preconditioner.n_iterations_S();
}
// step 1b: take the stronger solver in case
@@ -522,7 +555,9 @@ namespace aspect
AdditionalData(50, true));
solver.solve(stokes_block, distributed_stokes_solution,
distributed_stokes_rhs, preconditioner);
- }
+ its_A += preconditioner.n_iterations_A();
+ its_S += preconditioner.n_iterations_S();
+ }
// distribute hanging node and
// other constraints
@@ -551,6 +586,10 @@ namespace aspect
statistics.add_value("Iterations for Stokes solver",
solver_control_cheap.last_step() + solver_control_expensive.last_step());
+ statistics.add_value("Velocity iterations in Stokes preconditioner",
+ its_A);
+ statistics.add_value("Schur complement iterations in Stokes preconditioner",
+ its_S);
computing_timer.exit_section();
More information about the CIG-COMMITS
mailing list