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