[cig-commits] commit 1942 by heister to /var/svn/dealii/aspect
dealii.demon at gmail.com
dealii.demon at gmail.com
Mon Oct 7 14:42:30 PDT 2013
Revision 1942
simplify and speed up solve_advection(), remove TODO, add comments to explain what is going on
U trunk/aspect/source/simulator/solver.cc
http://www.dealii.org/websvn/revision.php?repname=Aspect+Repository&path=%2F&rev=1942&peg=1942
Diff:
Modified: trunk/aspect/source/simulator/solver.cc
===================================================================
--- trunk/aspect/source/simulator/solver.cc 2013-10-06 15:20:29 UTC (rev 1941)
+++ trunk/aspect/source/simulator/solver.cc 2013-10-07 21:41:42 UTC (rev 1942)
@@ -278,8 +278,6 @@
template <int dim>
double Simulator<dim>::solve_advection (const TemperatureOrComposition &temperature_or_composition)
{
- double initial_residual = 0;
-
double advection_solver_tolerance = -1;
unsigned int block_number = temperature_or_composition.block_index(introspection);
@@ -298,32 +296,38 @@
advection_solver_tolerance = parameters.composition_solver_tolerance;
}
+ const double tolerance = std::max(1e-50,
+ advection_solver_tolerance*system_rhs.block(block_number).l2_norm());
SolverControl solver_control (system_matrix.block(block_number, block_number).m(),
- advection_solver_tolerance*system_rhs.block(block_number).l2_norm());
+ tolerance);
SolverGMRES<LinearAlgebra::Vector> solver (solver_control,
SolverGMRES<LinearAlgebra::Vector>::AdditionalData(30,true));
-//TODO: clean up: why do we copy system_rhs here, then call set_zero when we later
-// overwrite the vector in residual(), then call set_zero again, and then throw away
-// the result
- LinearAlgebra::BlockVector
- distributed_solution (system_rhs);
+ // Create distributed vector (we need all blocks here even though we only
+ // solve for the current block) because only have a ConstraintMatrix
+ // for the whole system, current_linearization_point contains our initial guess.
+ LinearAlgebra::BlockVector distributed_solution (
+ introspection.index_sets.system_partitioning,
+ mpi_communicator);
+ distributed_solution.block(block_number) = current_linearization_point.block (block_number);
+
+ // Temporary vector to hold the residual, we don't need a BlockVector here.
+ LinearAlgebra::Vector temp (
+ introspection.index_sets.system_partitioning[block_number],
+ mpi_communicator);
+
+ // Compute the residual before we solve and return this at the end.
+ // This is used in the nonlinear solver.
+ double initial_residual = system_matrix.block(block_number,block_number).residual
+ (temp,
+ distributed_solution.block(block_number),
+ system_rhs.block(block_number));
+
+ // solve the linear system:
current_constraints.set_zero(distributed_solution);
- // create vector with distribution of system_rhs.
- LinearAlgebra::Vector block_remap (system_rhs.block (block_number));
- // copy block of current_linearization_point into it, because
- // current_linearization is distributed differently.
- block_remap = current_linearization_point.block (block_number);
- // (ab)use the distributed solution vector to temporarily put a residual in
- initial_residual = system_matrix.block(block_number,block_number).residual (distributed_solution.block(block_number),
- block_remap,
- system_rhs.block(block_number));
- current_constraints.set_zero(distributed_solution);
-
- // then overwrite it again with the current best guess and solve the linear system
- distributed_solution.block(block_number) = block_remap;
- solver.solve (system_matrix.block(block_number,block_number), distributed_solution.block(block_number),
+ solver.solve (system_matrix.block(block_number,block_number),
+ distributed_solution.block(block_number),
system_rhs.block(block_number),
(temperature_or_composition.is_temperature()
?
More information about the CIG-COMMITS
mailing list