xref: /petsc/src/snes/interface/snespc.c (revision 32f3f7c2c9beb895ed84c40472c591e5d009bbe5)
1*32f3f7c2SPeter Brune 
2*32f3f7c2SPeter Brune #include <petsc-private/snesimpl.h>      /*I "petscsnes.h"  I*/
3*32f3f7c2SPeter Brune #include <petscdmshell.h>
4*32f3f7c2SPeter Brune 
5*32f3f7c2SPeter Brune 
6*32f3f7c2SPeter Brune #undef __FUNCT__
7*32f3f7c2SPeter Brune #define __FUNCT__ "SNESApplyPC"
8*32f3f7c2SPeter Brune /*@
9*32f3f7c2SPeter Brune    SNESComputeFunction - Calls the function that has been set with SNESSetFunction().
10*32f3f7c2SPeter Brune 
11*32f3f7c2SPeter Brune    Collective on SNES
12*32f3f7c2SPeter Brune 
13*32f3f7c2SPeter Brune    Input Parameters:
14*32f3f7c2SPeter Brune +  snes - the SNES context
15*32f3f7c2SPeter Brune -  x - input vector
16*32f3f7c2SPeter Brune 
17*32f3f7c2SPeter Brune    Output Parameter:
18*32f3f7c2SPeter Brune .  y - function vector, as set by SNESSetFunction()
19*32f3f7c2SPeter Brune 
20*32f3f7c2SPeter Brune    Notes:
21*32f3f7c2SPeter Brune    SNESComputeFunction() should be called on X before SNESApplyPC() is called, as it is
22*32f3f7c2SPeter Brune    with SNESComuteJacobian().
23*32f3f7c2SPeter Brune 
24*32f3f7c2SPeter Brune    Level: developer
25*32f3f7c2SPeter Brune 
26*32f3f7c2SPeter Brune .keywords: SNES, nonlinear, compute, function
27*32f3f7c2SPeter Brune 
28*32f3f7c2SPeter Brune .seealso: SNESGetPC(),SNESSetPC(),SNESComputeFunction()
29*32f3f7c2SPeter Brune @*/
30*32f3f7c2SPeter Brune PetscErrorCode  SNESApplyPC(SNES snes,Vec x,Vec f,PetscReal *fnorm,Vec y)
31*32f3f7c2SPeter Brune {
32*32f3f7c2SPeter Brune   PetscErrorCode ierr;
33*32f3f7c2SPeter Brune 
34*32f3f7c2SPeter Brune   PetscFunctionBegin;
35*32f3f7c2SPeter Brune   PetscValidHeaderSpecific(snes,SNES_CLASSID,1);
36*32f3f7c2SPeter Brune   PetscValidHeaderSpecific(x,VEC_CLASSID,2);
37*32f3f7c2SPeter Brune   PetscValidHeaderSpecific(y,VEC_CLASSID,3);
38*32f3f7c2SPeter Brune   PetscCheckSameComm(snes,1,x,2);
39*32f3f7c2SPeter Brune   PetscCheckSameComm(snes,1,y,3);
40*32f3f7c2SPeter Brune   ierr = VecValidValues(x,2,PETSC_TRUE);CHKERRQ(ierr);
41*32f3f7c2SPeter Brune   if (snes->pc) {
42*32f3f7c2SPeter Brune     if (f) {
43*32f3f7c2SPeter Brune       ierr = SNESSetInitialFunction(snes->pc,f);CHKERRQ(ierr);
44*32f3f7c2SPeter Brune     }
45*32f3f7c2SPeter Brune     if (fnorm) {
46*32f3f7c2SPeter Brune       ierr = SNESSetInitialFunctionNorm(snes->pc,*fnorm);CHKERRQ(ierr);
47*32f3f7c2SPeter Brune     }
48*32f3f7c2SPeter Brune     ierr = VecCopy(x,y);CHKERRQ(ierr);
49*32f3f7c2SPeter Brune     ierr = PetscLogEventBegin(SNES_NPCSolve,snes->pc,x,y,0);CHKERRQ(ierr);
50*32f3f7c2SPeter Brune     ierr = SNESSolve(snes->pc,snes->vec_rhs,y);CHKERRQ(ierr);
51*32f3f7c2SPeter Brune     ierr = PetscLogEventEnd(SNES_NPCSolve,snes->pc,x,y,0);CHKERRQ(ierr);
52*32f3f7c2SPeter Brune     ierr = VecAYPX(y,-1.0,x);CHKERRQ(ierr);
53*32f3f7c2SPeter Brune     ierr = VecValidValues(y,3,PETSC_FALSE);CHKERRQ(ierr);
54*32f3f7c2SPeter Brune     PetscFunctionReturn(0);
55*32f3f7c2SPeter Brune   }
56*32f3f7c2SPeter Brune   ierr = VecValidValues(y,3,PETSC_FALSE);CHKERRQ(ierr);
57*32f3f7c2SPeter Brune   PetscFunctionReturn(0);
58*32f3f7c2SPeter Brune }
59*32f3f7c2SPeter Brune 
60*32f3f7c2SPeter Brune #undef __FUNCT__
61*32f3f7c2SPeter Brune #define __FUNCT__ "SNESComputeFunctionDefaultPC"
62*32f3f7c2SPeter Brune PetscErrorCode SNESComputeFunctionDefaultPC(SNES snes,Vec X,Vec F,void *ctx) {
63*32f3f7c2SPeter Brune /* This is to be used as an argument to SNESMF -- NOT as a "function" */
64*32f3f7c2SPeter Brune   PetscErrorCode ierr;
65*32f3f7c2SPeter Brune   PetscFunctionBegin;
66*32f3f7c2SPeter Brune   ierr = SNESApplyPC(snes,X,PETSC_NULL,PETSC_NULL,F);CHKERRQ(ierr);
67*32f3f7c2SPeter Brune   ierr = VecAYPX(F,-1.0,X);CHKERRQ(ierr);CHKERRQ(ierr);
68*32f3f7c2SPeter Brune 
69*32f3f7c2SPeter Brune PetscFunctionReturn(0);
70*32f3f7c2SPeter Brune }
71