xref: /petsc/src/snes/impls/ksponly/ksponly.c (revision d1e9a80f72efc361583d2fc822de9783b227627d)
1b79b07cfSJed Brown 
2b45d2f2cSJed Brown #include <petsc-private/snesimpl.h>
3b79b07cfSJed Brown 
4b79b07cfSJed Brown #undef __FUNCT__
5b79b07cfSJed Brown #define __FUNCT__ "SNESSolve_KSPONLY"
6b79b07cfSJed Brown static PetscErrorCode SNESSolve_KSPONLY(SNES snes)
7b79b07cfSJed Brown {
8b79b07cfSJed Brown   PetscErrorCode     ierr;
9b79b07cfSJed Brown   PetscInt           lits;
10b79b07cfSJed Brown   Vec                Y,X,F;
11b79b07cfSJed Brown   KSPConvergedReason kspreason;
12b79b07cfSJed Brown 
13b79b07cfSJed Brown   PetscFunctionBegin;
14b79b07cfSJed Brown   snes->numFailures            = 0;
15b79b07cfSJed Brown   snes->numLinearSolveFailures = 0;
16b79b07cfSJed Brown   snes->reason                 = SNES_CONVERGED_ITERATING;
17b79b07cfSJed Brown   snes->iter                   = 0;
18b79b07cfSJed Brown   snes->norm                   = 0.0;
19b79b07cfSJed Brown 
20b79b07cfSJed Brown   X = snes->vec_sol;
21b79b07cfSJed Brown   F = snes->vec_func;
22b79b07cfSJed Brown   Y = snes->vec_sol_update;
23b79b07cfSJed Brown 
24b79b07cfSJed Brown   ierr = SNESComputeFunction(snes,X,F);CHKERRQ(ierr);
25b79b07cfSJed Brown   if (snes->domainerror) {
26b79b07cfSJed Brown     snes->reason = SNES_DIVERGED_FUNCTION_DOMAIN;
27b79b07cfSJed Brown     PetscFunctionReturn(0);
28b79b07cfSJed Brown   }
29a5eaddd9SBarry Smith   if (snes->numbermonitors) {
30a5eaddd9SBarry Smith     PetscReal fnorm;
31a5eaddd9SBarry Smith     ierr = VecNorm(F,NORM_2,&fnorm);CHKERRQ(ierr);
32a5eaddd9SBarry Smith     ierr = SNESMonitor(snes,0,fnorm);CHKERRQ(ierr);
33a5eaddd9SBarry Smith   }
34b79b07cfSJed Brown 
355341784dSBarry Smith   /* Call general purpose update function */
365341784dSBarry Smith   if (snes->ops->update) {
375341784dSBarry Smith     ierr = (*snes->ops->update)(snes, 0);CHKERRQ(ierr);
385341784dSBarry Smith   }
395341784dSBarry Smith 
40b79b07cfSJed Brown   /* Solve J Y = F, where J is Jacobian matrix */
41*d1e9a80fSBarry Smith   ierr = SNESComputeJacobian(snes,X,snes->jacobian,snes->jacobian_pre);CHKERRQ(ierr);
4223ee1639SBarry Smith   ierr = KSPSetOperators(snes->ksp,snes->jacobian,snes->jacobian_pre);CHKERRQ(ierr);
43b79b07cfSJed Brown   ierr = KSPSolve(snes->ksp,F,Y);CHKERRQ(ierr);
44b79b07cfSJed Brown   ierr = KSPGetConvergedReason(snes->ksp,&kspreason);CHKERRQ(ierr);
45b79b07cfSJed Brown   if (kspreason < 0 && ++snes->numLinearSolveFailures >= snes->maxLinearSolveFailures) {
46b79b07cfSJed Brown     ierr         = PetscInfo2(snes,"iter=%D, number linear solve failures %D greater than current SNES allowed, stopping solve\n",snes->iter,snes->numLinearSolveFailures);CHKERRQ(ierr);
47b79b07cfSJed Brown     snes->reason = SNES_DIVERGED_LINEAR_SOLVE;
481aa26658SKarl Rupp   } else snes->reason = SNES_CONVERGED_ITS;
491aa26658SKarl Rupp 
50b79b07cfSJed Brown   ierr              = KSPGetIterationNumber(snes->ksp,&lits);CHKERRQ(ierr);
51b79b07cfSJed Brown   snes->linear_its += lits;
52b79b07cfSJed Brown   ierr              = PetscInfo2(snes,"iter=%D, linear solve iterations=%D\n",snes->iter,lits);CHKERRQ(ierr);
53b79b07cfSJed Brown   snes->iter++;
54b79b07cfSJed Brown 
55b79b07cfSJed Brown   /* Take the computed step. */
56b79b07cfSJed Brown   ierr = VecAXPY(X,-1.0,Y);CHKERRQ(ierr);
57a5eaddd9SBarry Smith   if (snes->numbermonitors) {
58a5eaddd9SBarry Smith     PetscReal fnorm;
59a5eaddd9SBarry Smith     ierr = SNESComputeFunction(snes,X,F);CHKERRQ(ierr);
60a5eaddd9SBarry Smith     ierr = VecNorm(F,NORM_2,&fnorm);CHKERRQ(ierr);
61a5eaddd9SBarry Smith     ierr = SNESMonitor(snes,1,fnorm);CHKERRQ(ierr);
62a5eaddd9SBarry Smith   }
63b79b07cfSJed Brown   PetscFunctionReturn(0);
64b79b07cfSJed Brown }
65b79b07cfSJed Brown 
66b79b07cfSJed Brown #undef __FUNCT__
67b79b07cfSJed Brown #define __FUNCT__ "SNESSetUp_KSPONLY"
68b79b07cfSJed Brown static PetscErrorCode SNESSetUp_KSPONLY(SNES snes)
69b79b07cfSJed Brown {
706cab3a1bSJed Brown   PetscErrorCode ierr;
71b79b07cfSJed Brown 
72b79b07cfSJed Brown   PetscFunctionBegin;
736cab3a1bSJed Brown   ierr = SNESSetUpMatrices(snes);CHKERRQ(ierr);
74b79b07cfSJed Brown   PetscFunctionReturn(0);
75b79b07cfSJed Brown }
76b79b07cfSJed Brown 
77b79b07cfSJed Brown #undef __FUNCT__
78b79b07cfSJed Brown #define __FUNCT__ "SNESDestroy_KSPONLY"
79b79b07cfSJed Brown static PetscErrorCode SNESDestroy_KSPONLY(SNES snes)
80b79b07cfSJed Brown {
81b79b07cfSJed Brown 
82b79b07cfSJed Brown   PetscFunctionBegin;
83b79b07cfSJed Brown   PetscFunctionReturn(0);
84b79b07cfSJed Brown }
85b79b07cfSJed Brown 
86b79b07cfSJed Brown /* -------------------------------------------------------------------------- */
87b79b07cfSJed Brown /*MC
88b79b07cfSJed Brown       SNESKSPONLY - Nonlinear solver that only performs one Newton step and does not compute any norms.
89b79b07cfSJed Brown       The main purpose of this solver is to solve linear problems using the SNES interface, without
90b79b07cfSJed Brown       any additional overhead in the form of vector operations.
91b79b07cfSJed Brown 
92b79b07cfSJed Brown    Level: beginner
93b79b07cfSJed Brown 
9404d7464bSBarry Smith .seealso:  SNESCreate(), SNES, SNESSetType(), SNESNEWTONLS, SNESNEWTONTR
95b79b07cfSJed Brown M*/
96b79b07cfSJed Brown #undef __FUNCT__
97b79b07cfSJed Brown #define __FUNCT__ "SNESCreate_KSPONLY"
988cc058d9SJed Brown PETSC_EXTERN PetscErrorCode SNESCreate_KSPONLY(SNES snes)
99b79b07cfSJed Brown {
100b79b07cfSJed Brown 
101b79b07cfSJed Brown   PetscFunctionBegin;
102b79b07cfSJed Brown   snes->ops->setup          = SNESSetUp_KSPONLY;
103b79b07cfSJed Brown   snes->ops->solve          = SNESSolve_KSPONLY;
104b79b07cfSJed Brown   snes->ops->destroy        = SNESDestroy_KSPONLY;
10537596af1SLisandro Dalcin   snes->ops->setfromoptions = 0;
10637596af1SLisandro Dalcin   snes->ops->view           = 0;
10737596af1SLisandro Dalcin   snes->ops->reset          = 0;
108b79b07cfSJed Brown 
10942f4f86dSBarry Smith   snes->usesksp = PETSC_TRUE;
11042f4f86dSBarry Smith   snes->usespc  = PETSC_FALSE;
11142f4f86dSBarry Smith 
112b79b07cfSJed Brown   snes->data = 0;
113b79b07cfSJed Brown   PetscFunctionReturn(0);
114b79b07cfSJed Brown }
115