13 #include "libmesh/petsc_nonlinear_solver.h" 14 #include "libmesh/petsc_solver_exception.h" 28 _solver =
dynamic_cast<PetscNonlinearSolver<Real> *
>(
32 "This line search operates only with Petsc, so Petsc must be your nonlinear solver.");
38 PetscBool changed_y = PETSC_FALSE, changed_w = PETSC_FALSE;
40 Vec X,
F, Y, W,
G, W1;
41 SNESLineSearch line_search;
42 PetscReal fnorm, xnorm, ynorm, gnorm;
43 PetscBool domainerror;
44 PetscReal ksp_rtol, ksp_abstol, ksp_dtol;
49 ierr = SNESGetLineSearch(snes, &line_search);
51 ierr = SNESLineSearchGetVecs(line_search, &X, &
F, &Y, &W, &
G);
53 ierr = SNESLineSearchGetNorms(line_search, &xnorm, &fnorm, &ynorm);
55 ierr = SNESLineSearchGetSNES(line_search, &snes);
57 ierr = SNESLineSearchSetReason(line_search, SNES_LINESEARCH_SUCCEEDED);
59 ierr = SNESGetKSP(snes, &ksp);
61 ierr = KSPGetTolerances(ksp, &ksp_rtol, &ksp_abstol, &ksp_dtol, &ksp_maxits);
63 ierr = VecDuplicate(W, &W1);
75 ierr = SNESLineSearchPreCheck(line_search, X, Y, &changed_y);
86 ierr = SNESComputeFunction(snes, W,
F);
88 ierr = SNESGetFunctionDomainError(snes, &domainerror);
92 ierr = SNESLineSearchSetReason(line_search, SNES_LINESEARCH_FAILED_DOMAIN);
95 ierr = VecNorm(
F, NORM_2, &fnorm);
105 KSPSetTolerances(ksp,
_contact_ltol, ksp_abstol, ksp_dtol, ksp_maxits);
106 _console <<
"Contact set changed since previous non-linear iteration!" << std::endl;
109 KSPSetTolerances(ksp,
_user_ksp_rtol, ksp_abstol, ksp_dtol, ksp_maxits);
118 LIBMESH_CHKERR(
ierr);
120 ierr = SNESComputeFunction(snes, W1,
G);
121 LIBMESH_CHKERR(
ierr);
122 ierr = SNESGetFunctionDomainError(snes, &domainerror);
123 LIBMESH_CHKERR(
ierr);
126 ierr = SNESLineSearchSetReason(line_search, SNES_LINESEARCH_FAILED_DOMAIN);
127 LIBMESH_CHKERR(
ierr);
129 ierr = VecNorm(
G, NORM_2, &gnorm);
130 LIBMESH_CHKERR(
ierr);
134 LIBMESH_CHKERR(
ierr);
136 LIBMESH_CHKERR(
ierr);
148 LIBMESH_CHKERR(
ierr);
150 ierr = SNESLineSearchPostCheck(line_search, X, Y, W, &changed_y, &changed_w);
151 LIBMESH_CHKERR(
ierr);
155 ierr = VecWAXPY(W, -1., Y, X);
156 LIBMESH_CHKERR(
ierr);
159 if (changed_w || changed_y)
161 ierr = SNESComputeFunction(snes, W,
F);
162 LIBMESH_CHKERR(
ierr);
163 ierr = SNESGetFunctionDomainError(snes, &domainerror);
164 LIBMESH_CHKERR(
ierr);
167 ierr = SNESLineSearchSetReason(line_search, SNES_LINESEARCH_FAILED_DOMAIN);
168 LIBMESH_CHKERR(
ierr);
176 ierr = VecCopy(W, X);
177 LIBMESH_CHKERR(
ierr);
179 ierr = SNESLineSearchComputeNorms(line_search);
180 LIBMESH_CHKERR(
ierr);
182 ierr = VecDestroy(&W1);
183 LIBMESH_CHKERR(
ierr);
static const std::string F
virtual NonlinearSolver< Number > * nonlinearSolver() override
static const std::string G
void mooseError(Args &&... args) const
const ConsoleStream _console
virtual NonlinearSystem & getNonlinearSystem(const unsigned int nl_sys_num) override