6#include <deal.II/lac/affine_constraints.h>
7#include <deal.II/lac/solver_cg.h>
16#include <prismspf/config.h>
20template <
unsigned int dim,
unsigned int degree,
typename number>
26template <
unsigned int dim,
unsigned int degree,
typename number>
45 :
LinearSolver<dim, degree, number>(_solve_block, _solve_context)
47 solve_context->get_user_inputs().nonlinear_solve_parameters.newton_solvers.at(
55 init(
const std::list<DependencyMap> &all_dependeny_sets)
override
58 unsigned int num_levels =
solve_context->get_dof_manager().get_dof_handlers().size();
60 for (
unsigned int relative_level = 0; relative_level < num_levels; ++relative_level)
63 solutions.get_solution_full_vector(relative_level));
75 for (
unsigned int relative_level = 0; relative_level < num_levels; ++relative_level)
78 solutions.get_solution_full_vector(relative_level));
90 unsigned int newton_max_iterations =
newton_params.max_iterations;
98 if (!
solutions.get_solution_level(relative_level).old_solutions.empty())
100 solutions.get_solution_full_vector(relative_level) =
101 solutions.get_old_solution_full_vector(0, relative_level);
105 bool newton_unconverged =
true;
106 unsigned int iter = 0;
107 number l2_norm = -1.0;
108 int total_lin_iters = 0;
109 while (newton_unconverged && iter++ < newton_max_iterations)
115 newton_residual.zero_out_ghost_values();
118 newton_residual.update_ghost_values();
121 total_lin_iters +=
do_linear_solve(newton_residual, lhs_op, newton_update);
122 newton_update.update_ghost_values();
125 solutions.get_solution_full_vector(relative_level)
126 .add(newton_step_length, newton_update);
129 solutions.apply_constraints(relative_level);
137 l2_norm = newton_residual.l2_norm();
138 newton_unconverged = l2_norm > newton_tolerance;
143 if (
solve_context->get_user_inputs().output_parameters.should_output(
148 <<
" Newton steps: " << iter <<
" Total linear steps: " << total_lin_iters
152 if (iter >= newton_max_iterations)
155 <<
"[Increment " <<
solve_context->get_simulation_timer().get_increment()
157 <<
"Warning: Newton solver did not converge before " << newton_max_iterations
158 <<
" iterations.\n\n";
167PRISMS_PF_END_NAMESPACE
static dealii::ConditionalOStream & pout_summary()
Log output stream for writing a summary.log file.
Definition conditional_ostreams.cc:35
static dealii::ConditionalOStream & pout_base()
Generic parallel output stream. Used for essential information in release and debug mode.
Definition conditional_ostreams.cc:44
std::vector< MFOperator< dim, degree, number > > rhs_operators
Matrix free operators for each level.
Definition linear_solver.h:202
int do_linear_solve(BlockVector< number > &b_vector, MFOperator< dim, degree, number > &lhs_operator, BlockVector< number > &x_vector)
Definition linear_solver.h:168
double normalization_value()
Definition linear_solver.h:208
void init(const std::list< DependencyMap > &all_dependeny_sets) override
Initialize the solver.
Definition linear_solver.h:56
std::vector< BlockVector< number > > rhs_vector
Definition linear_solver.h:205
std::vector< MFOperator< dim, degree, number > > lhs_operators
Definition linear_solver.h:204
LinearSolver(SolveBlock _solve_block, const SolveContext< dim, degree, number > &_solve_context)
Constructor.
Definition linear_solver.h:44
void reinit() override
Reinitialize the solver.
Definition linear_solver.h:115
This class exists to evaluate a single user-defined operator for the matrix-free implementation of so...
Definition mf_operator.h:50
void compute_operator(BlockVector< number > &dst, const BlockVector< number > &src=BlockVector< number >()) const
Calls cell_loop on function that calls user-defined operator.
Definition mf_operator.cc:17
void reinit() override
Reinitialize the solver.
Definition newton_solver.h:71
NonlinearSolverParameters newton_params
Definition newton_solver.h:164
void init(const std::list< DependencyMap > &all_dependeny_sets) override
Initialize the solver.
Definition newton_solver.h:55
void solve_level(unsigned int relative_level) override
Solve for a single update step.
Definition newton_solver.h:86
NewtonSolver(SolveBlock _solve_block, const SolveContext< dim, degree, number > &_solve_context)
Constructor.
Definition newton_solver.h:43
std::vector< BlockVector< number > > newton_updates
Definition newton_solver.h:163
Structure to hold the attributes of a solve-block.
Definition solve_block.h:56
This class provides context for a solver with ptrs to all the relevant dependencies.
Definition solve_context.h:36
SolverBase(SolveBlock _solve_block, const SolveContext< dim, degree, number > &_solve_context)
Constructor.
Definition solver_base.h:37
GroupSolutionHandler< dim, number > solutions
Solution vectors for fields handled by this solver.
Definition solver_base.h:274
const SolveContext< dim, degree, number > * solve_context
Solver context provides access to external information.
Definition solver_base.h:269
SolveBlock solve_block
Information about the solve block this handler is responsible for.
Definition solver_base.h:264
static void start_section(const char *name)
Start a new timer section.
Definition timer.cc:116
static void end_section(const char *name)
End the timer section.
Definition timer.cc:127
dealii::LinearAlgebra::distributed::BlockVector< number > BlockVector
Typedef for solution block vector.
Definition group_solution_handler.h:29
Definition conditional_ostreams.cc:20
Struct that stores relevant nonlinear solve information of a certain field.
Definition nonlinear_solve_parameters.h:18