24 #ifndef FRACTIONAL_STEP_THETA_STEP_NEWTON_SOLVER_H_
25 #define FRACTIONAL_STEP_THETA_STEP_NEWTON_SOLVER_H_
27 #include <deal.II/lac/vector.h>
28 #include <deal.II/lac/block_sparsity_pattern.h>
29 #include <deal.II/lac/block_sparse_matrix.h>
30 #include <deal.II/numerics/vector_tools.h>
54 template <
typename INTEGRATOR,
typename LINEARSOLVER,
typename VECTOR>
83 template<
typename PROBLEM>
117 template<
typename PROBLEM>
118 bool NonlinearSolve(PROBLEM& pde,
const VECTOR &last_time_solution, VECTOR &solution,
119 bool apply_boundary_values=
true,
120 bool force_matrix_build=
false,
int priority = 5, std::string algo_level =
"\t\t ");
152 template<
typename PROBLEM>
154 bool force_matrix_build=
false,
int priority = 5, std::string algo_level =
"\t\t ");
168 template<
typename PROBLEM>
176 INTEGRATOR &integrator_;
180 double nonlinear_global_tol_, nonlinear_tol_, nonlinear_rho_;
181 double linesearch_rho_;
182 int nonlinear_maxiter_, line_maxiter_;
187 template <
typename INTEGRATOR,
typename LINEARSOLVER,
typename VECTOR>
192 param_reader.
declare_entry(
"nonlinear_global_tol",
"1.e-12",Patterns::Double(0),
"global tolerance for the newton iteration");
193 param_reader.
declare_entry(
"nonlinear_tol",
"1.e-10",Patterns::Double(0),
"relative tolerance for the newton iteration");
194 param_reader.
declare_entry(
"nonlinear_maxiter",
"10",Patterns::Integer(0),
"maximal number of newton iterations");
195 param_reader.
declare_entry(
"nonlinear_rho",
"0.1",Patterns::Double(0),
"minimal newton reduction, if actual reduction is less, matrix is rebuild ");
197 param_reader.
declare_entry(
"line_maxiter",
"4",Patterns::Integer(0),
"maximal number of linesearch steps");
198 param_reader.
declare_entry(
"linesearch_rho",
"0.9",Patterns::Double(0),
"reduction rate for the linesearch damping paramete");
200 LINEARSOLVER::declare_params(param_reader);
205 template <
typename INTEGRATOR,
typename LINEARSOLVER,
typename VECTOR>
208 : LINEARSOLVER(param_reader), integrator_(integrator)
211 nonlinear_global_tol_ = param_reader.
get_double (
"nonlinear_global_tol");
212 nonlinear_tol_ = param_reader.
get_double (
"nonlinear_tol");
213 nonlinear_maxiter_ = param_reader.
get_integer (
"nonlinear_maxiter");
214 nonlinear_rho_ = param_reader.
get_double (
"nonlinear_rho");
216 line_maxiter_ = param_reader.
get_integer (
"line_maxiter");
217 linesearch_rho_ = param_reader.
get_double (
"linesearch_rho");
223 template <
typename INTEGRATOR,
typename LINEARSOLVER,
typename VECTOR>
230 template <
typename INTEGRATOR,
typename LINEARSOLVER,
typename VECTOR>
231 template<
typename PROBLEM>
235 LINEARSOLVER::ReInit(pde);
239 template <
typename INTEGRATOR,
typename LINEARSOLVER,
typename VECTOR>
240 template<
typename PROBLEM>
246 tmp_residual.reinit(residual);
248 GetIntegrator().AddDomainData(
"last_newton_solution",&last_time_solution);
249 GetIntegrator().AddDomainData(
"last_time_solution",&last_time_solution);
250 pde.SetStepPart(
"Old_for_1st_cycle");
251 GetIntegrator().ComputeNonlinearLhs(pde,residual);
252 GetIntegrator().ComputeNonlinearRhs(pde,tmp_residual);
254 residual += tmp_residual;
256 GetIntegrator().DeleteDomainData(
"last_newton_solution");
257 GetIntegrator().DeleteDomainData(
"last_time_solution");
261 template <
typename INTEGRATOR,
typename LINEARSOLVER,
typename VECTOR>
262 template<
typename PROBLEM>
265 bool force_matrix_build,
int priority, std::string algo_level)
267 bool build_matrix = force_matrix_build;
270 std::stringstream out;
271 pde.GetOutputHandler()->InitNewtonOut(out);
274 residual.reinit(solution);
276 if(apply_boundary_values)
278 GetIntegrator().ApplyInitialBoundaryValues(pde,solution);
280 pde.GetDoFConstraints().distribute(solution);
282 GetIntegrator().AddDomainData(
"last_newton_solution",&solution);
284 GetIntegrator().ComputeNonlinearResidual(pde,residual);
287 pde.GetOutputHandler()->SetIterationNumber(0,
"PDENewton");
288 pde.GetOutputHandler()->Write(residual,
"Residual"+pde.GetType(),pde.GetDoFType());
290 double res = residual.linfty_norm();
291 double firstres = res;
292 double lastres = res;
295 out<< algo_level <<
"Newton step: " <<0<<
"\t Residual (abs.): "
296 <<pde.GetOutputHandler()->ZeroTolerance(res, 1.0)
299 out<< algo_level <<
"Newton step: " <<0<<
"\t Residual (rel.): " << std::scientific << firstres/firstres;
302 pde.GetOutputHandler()->Write(out,priority);
305 while(res > nonlinear_global_tol_ && res > firstres * nonlinear_tol_)
309 if(iter > nonlinear_maxiter_)
311 GetIntegrator().DeleteDomainData(
"last_newton_solution");
312 throw DOpEIterationException(
"Iteration count exceeded bounds!",
"InstatStepNewtonSolver::NonlinearSolve_Initial");
315 pde.GetOutputHandler()->SetIterationNumber(iter,
"PDENewton");
317 LINEARSOLVER::Solve(pde,GetIntegrator(),residual,du,build_matrix);
318 build_matrix =
false;
323 GetIntegrator().ComputeNonlinearResidual(pde,residual);
326 pde.GetOutputHandler()->Write(residual,
"Residual"+pde.GetType(),pde.GetDoFType());
327 pde.GetOutputHandler()->Write(du,
"Update"+pde.GetType(),pde.GetDoFType());
329 double newres = residual.linfty_norm();
331 double rho = linesearch_rho_;
336 out<< algo_level <<
"Newton step: " <<iter<<
"\t Residual (rel.): "
337 <<pde.GetOutputHandler()->ZeroTolerance(newres/firstres, 1.0)
338 <<
"\t LineSearch {"<<lineiter<<
"} ";
340 pde.GetOutputHandler()->Write(out,priority+1);
343 if(lineiter > line_maxiter_)
345 GetIntegrator().DeleteDomainData(
"last_newton_solution");
346 throw DOpEIterationException(
"Line-Iteration count exceeded bounds!",
"InstatStepNewtonSolver::NonlinearSolve_Initial");
348 solution.add(alpha*(rho-1.),du);
351 GetIntegrator().ComputeNonlinearResidual(pde,residual);
353 pde.GetOutputHandler()->Write(residual,
"Residual"+pde.GetType(),pde.GetDoFType());
355 newres = residual.linfty_norm();
358 if(res/lastres > nonlinear_rho_)
368 <<
"\t Residual (rel.): "
369 << pde.GetOutputHandler()->ZeroTolerance(res/firstres, 1.0)
375 pde.GetOutputHandler()->Write(out,priority);
379 GetIntegrator().DeleteDomainData(
"last_newton_solution");
385 template <
typename INTEGRATOR,
typename LINEARSOLVER,
typename VECTOR>
386 template<
typename PROBLEM>
389 const VECTOR &last_time_solution,
391 bool apply_boundary_values,
392 bool force_matrix_build,
397 bool build_matrix = force_matrix_build;
398 VECTOR residual, time_residual, tmp_residual;
399 VECTOR du, tmp_last_time_solution;
400 std::stringstream out;
401 pde.GetOutputHandler()->InitNewtonOut(out);
404 double firstres = 0.0;
405 double lastres = 0.0;
408 residual.reinit(solution);
409 time_residual.reinit(solution);
410 tmp_residual.reinit(solution);
411 tmp_last_time_solution.reinit(solution);
416 solution = last_time_solution;
420 if(apply_boundary_values)
422 GetIntegrator().ApplyInitialBoundaryValues(pde,solution);
426 GetIntegrator().AddDomainData(
"last_time_solution",&last_time_solution);
427 GetIntegrator().AddDomainData(
"last_newton_solution",&solution);
428 pde.SetStepPart(
"New_for_1st_and_3rd_cycle");
429 GetIntegrator().ComputeNonlinearRhs(pde,tmp_residual);
431 residual += tmp_residual;
434 time_residual = residual;
438 GetIntegrator().ComputeNonlinearLhs(pde,tmp_residual);
439 residual += tmp_residual;
443 pde.GetOutputHandler()->SetIterationNumber(0,
"PDENewton");
444 pde.GetOutputHandler()->Write(residual,
"Residual"+pde.GetType(),pde.GetDoFType());
446 res = residual.linfty_norm();
451 out<<
"\t\t Newton step: " <<0<<
"\t Residual (abs.): "
452 <<pde.GetOutputHandler()->ZeroTolerance(res, 1.0)
454 out<<
"\t\t Newton step: " <<0<<
"\t Residual (rel.): "<< std::scientific << firstres/firstres;
459 pde.GetOutputHandler()->Write(out,priority);
460 while(res > nonlinear_global_tol_ && res > firstres * nonlinear_tol_)
463 if(iter > nonlinear_maxiter_)
468 pde.GetOutputHandler()->SetIterationNumber(iter,
"PDENewton");
469 LINEARSOLVER::Solve(pde,GetIntegrator(),residual,du,build_matrix);
470 build_matrix =
false;
474 GetIntegrator().ComputeNonlinearLhs(pde,residual);
475 residual -= time_residual;
477 pde.GetOutputHandler()->Write(residual,
"Residual"+pde.GetType(),pde.GetDoFType());
479 double newres = residual.linfty_norm();
481 double rho = linesearch_rho_;
486 out<<
"\t\t\t Linesearch step: " <<lineiter<<
"\t Residual (rel.): "
487 <<pde.GetOutputHandler()->ZeroTolerance(newres/firstres, 1.0);
489 pde.GetOutputHandler()->Write(out,priority+1);
491 if(lineiter > line_maxiter_)
495 solution.add(alpha*(rho-1.),du);
498 GetIntegrator().ComputeNonlinearLhs(pde,residual);
499 residual -= time_residual;
501 pde.GetOutputHandler()->Write(residual,
"Residual"+pde.GetType(),pde.GetDoFType());
503 newres = residual.linfty_norm();
506 if(res/lastres > nonlinear_rho_)
513 out<<
"\t\t Newton step: " <<iter<<
"\t Residual (rel.): "
514 << pde.GetOutputHandler()->ZeroTolerance(res/firstres, 1.0)
515 <<
"\t LineSearch {"<<lineiter<<
"} ";
516 pde.GetOutputHandler()->Write(out,priority);
520 GetIntegrator().DeleteDomainData(
"last_time_solution");
521 GetIntegrator().DeleteDomainData(
"last_newton_solution");
525 tmp_last_time_solution = 0;
526 tmp_last_time_solution = solution;
530 GetIntegrator().AddDomainData(
"last_time_solution",&tmp_last_time_solution);
533 GetIntegrator().AddDomainData(
"last_newton_solution",&tmp_last_time_solution);
534 pde.SetStepPart(
"Old_for_2nd_cycle");
535 GetIntegrator().ComputeNonlinearLhs(pde,residual);
537 GetIntegrator().ComputeNonlinearRhs(pde,tmp_residual);
539 residual += tmp_residual;
541 GetIntegrator().DeleteDomainData(
"last_newton_solution");
544 if(apply_boundary_values)
546 GetIntegrator().ApplyInitialBoundaryValues(pde,solution);
551 GetIntegrator().AddDomainData(
"last_newton_solution",&solution);
552 pde.SetStepPart(
"New_for_2nd_cycle");
553 GetIntegrator().ComputeNonlinearRhs(pde,tmp_residual);
555 residual += tmp_residual;
558 time_residual = residual;
562 GetIntegrator().ComputeNonlinearLhs(pde,tmp_residual);
563 residual += tmp_residual;
567 pde.GetOutputHandler()->SetIterationNumber(0,
"PDENewton");
568 pde.GetOutputHandler()->Write(residual,
"Residual"+pde.GetType(),pde.GetDoFType());
570 res = residual.linfty_norm();
575 out<<
"\t\t Newton step: " <<0<<
"\t Residual (abs.): "
576 <<pde.GetOutputHandler()->ZeroTolerance(res, 1.0)
579 out<<
"\t\t Newton step: " <<0<<
"\t Residual (rel.): "<< std::scientific << firstres/firstres;
582 pde.GetOutputHandler()->Write(out,priority);
583 while(res > nonlinear_global_tol_ && res > firstres * nonlinear_tol_)
586 if(iter > nonlinear_maxiter_)
591 pde.GetOutputHandler()->SetIterationNumber(iter,
"PDENewton");
592 LINEARSOLVER::Solve(pde,GetIntegrator(),residual,du,build_matrix);
593 build_matrix =
false;
597 GetIntegrator().ComputeNonlinearLhs(pde,residual);
598 residual -= time_residual;
600 pde.GetOutputHandler()->Write(residual,
"Residual"+pde.GetType(),pde.GetDoFType());
602 double newres = residual.linfty_norm();
604 double rho = linesearch_rho_;
609 out<<
"\t\t\t Linesearch step: " <<lineiter<<
"\t Residual (rel.): "
610 <<pde.GetOutputHandler()->ZeroTolerance(newres/firstres, 1.0);
612 pde.GetOutputHandler()->Write(out,priority+1);
614 if(lineiter > line_maxiter_)
618 solution.add(alpha*(rho-1.),du);
621 GetIntegrator().ComputeNonlinearLhs(pde,residual);
622 residual -= time_residual;
624 pde.GetOutputHandler()->Write(residual,
"Residual"+pde.GetType(),pde.GetDoFType());
626 newres = residual.linfty_norm();
629 if(res/lastres > nonlinear_rho_)
636 out<<
"\t\t Newton step: " <<iter<<
"\t Residual (rel.): "
637 << pde.GetOutputHandler()->ZeroTolerance(res/firstres, 1.0)
638 <<
"\t LineSearch {"<<lineiter<<
"} ";
640 pde.GetOutputHandler()->Write(out,priority);
644 GetIntegrator().DeleteDomainData(
"last_time_solution");
645 GetIntegrator().DeleteDomainData(
"last_newton_solution");
649 tmp_last_time_solution = 0;
650 tmp_last_time_solution = solution;
654 GetIntegrator().AddDomainData(
"last_time_solution",&tmp_last_time_solution);
657 GetIntegrator().AddDomainData(
"last_newton_solution",&tmp_last_time_solution);
658 pde.SetStepPart(
"Old_for_3rd_cycle");
659 GetIntegrator().ComputeNonlinearLhs(pde,residual);
661 GetIntegrator().ComputeNonlinearRhs(pde,tmp_residual);
663 residual += tmp_residual;
665 GetIntegrator().DeleteDomainData(
"last_newton_solution");
668 if(apply_boundary_values)
670 GetIntegrator().ApplyInitialBoundaryValues(pde,solution);
674 GetIntegrator().AddDomainData(
"last_newton_solution",&solution);
675 pde.SetStepPart(
"New_for_1st_and_3rd_cycle");
676 GetIntegrator().ComputeNonlinearRhs(pde,tmp_residual);
678 residual += tmp_residual;
681 time_residual = residual;
685 GetIntegrator().ComputeNonlinearLhs(pde,tmp_residual);
686 residual += tmp_residual;
690 pde.GetOutputHandler()->SetIterationNumber(0,
"PDENewton");
691 pde.GetOutputHandler()->Write(residual,
"Residual"+pde.GetType(),pde.GetDoFType());
693 res = residual.linfty_norm();
698 out<<
"\t\t Newton step: " <<0<<
"\t Residual (abs.): "
699 <<pde.GetOutputHandler()->ZeroTolerance(res, 1.0)
702 out<<
"\t\t Newton step: " <<0<<
"\t Residual (rel.): "<< std::scientific << firstres/firstres;
705 pde.GetOutputHandler()->Write(out,priority);
706 while(res > nonlinear_global_tol_ && res > firstres * nonlinear_tol_)
709 if(iter > nonlinear_maxiter_)
714 pde.GetOutputHandler()->SetIterationNumber(iter,
"PDENewton");
715 LINEARSOLVER::Solve(pde,GetIntegrator(),residual,du,build_matrix);
716 build_matrix =
false;
720 GetIntegrator().ComputeNonlinearLhs(pde,residual);
721 residual -= time_residual;
723 pde.GetOutputHandler()->Write(residual,
"Residual"+pde.GetType(),pde.GetDoFType());
725 double newres = residual.linfty_norm();
727 double rho = linesearch_rho_;
732 out<<
"\t\t\t Linesearch step: " <<lineiter<<
"\t Residual (rel.): "
733 <<pde.GetOutputHandler()->ZeroTolerance(newres/firstres, 1.0);
735 pde.GetOutputHandler()->Write(out,priority+1);
737 if(lineiter > line_maxiter_)
741 solution.add(alpha*(rho-1.),du);
744 GetIntegrator().ComputeNonlinearLhs(pde,residual);
745 residual -= time_residual;
747 pde.GetOutputHandler()->Write(residual,
"Residual"+pde.GetType(),pde.GetDoFType());
749 newres = residual.linfty_norm();
752 if(res/lastres > nonlinear_rho_)
759 out<<
"\t\t Newton step: " <<iter<<
"\t Residual (rel.): "
760 << pde.GetOutputHandler()->ZeroTolerance(res/firstres, 1.0)
761 <<
"\t LineSearch {"<<lineiter<<
"} ";
763 pde.GetOutputHandler()->Write(out,priority);
767 GetIntegrator().DeleteDomainData(
"last_time_solution");
768 GetIntegrator().DeleteDomainData(
"last_newton_solution");
777 template <
typename INTEGRATOR,
typename LINEARSOLVER,
typename VECTOR>
Definition: dopeexception.h:76
INTEGRATOR & GetIntegrator()
Definition: fractional_step_theta_step_newtonsolver.h:779
double get_double(const std::string &entry_name)
Definition: parameterreader.h:115
Definition: parameterreader.h:36
~FractionalStepThetaStepNewtonSolver()
Definition: fractional_step_theta_step_newtonsolver.h:225
void declare_entry(const std::string &entry, const std::string &default_value, const Patterns::PatternBase &pattern=Patterns::Anything(), const std::string &documentation=std::string())
Definition: parameterreader.h:98
FractionalStepThetaStepNewtonSolver(INTEGRATOR &integrator, ParameterReader ¶m_reader)
Definition: fractional_step_theta_step_newtonsolver.h:207
bool NonlinearSolve_Initial(PROBLEM &pde, VECTOR &solution, bool apply_boundary_values=true, bool force_matrix_build=false, int priority=5, std::string algo_level="\t\t ")
Definition: fractional_step_theta_step_newtonsolver.h:264
void ReInit(PROBLEM &pde)
Definition: fractional_step_theta_step_newtonsolver.h:233
Definition: fractional_step_theta_step_newtonsolver.h:55
void NonlinearLastTimeEvals(PROBLEM &pde, const VECTOR &last_time_solution, VECTOR &residual)
Definition: fractional_step_theta_step_newtonsolver.h:242
int get_integer(const std::string &entry_name)
Definition: parameterreader.h:126
void SetSubsection(const std::string subsection)
Definition: parameterreader.h:93
static void declare_params(ParameterReader ¶m_reader)
Definition: fractional_step_theta_step_newtonsolver.h:189
bool NonlinearSolve(PROBLEM &pde, const VECTOR &last_time_solution, VECTOR &solution, bool apply_boundary_values=true, bool force_matrix_build=false, int priority=5, std::string algo_level="\t\t ")
Definition: fractional_step_theta_step_newtonsolver.h:388