132f3f7c2SPeter Brune 232f3f7c2SPeter Brune #include <petsc-private/snesimpl.h> /*I "petscsnes.h" I*/ 332f3f7c2SPeter Brune #include <petscdmshell.h> 432f3f7c2SPeter Brune 532f3f7c2SPeter Brune 632f3f7c2SPeter Brune #undef __FUNCT__ 732f3f7c2SPeter Brune #define __FUNCT__ "SNESApplyPC" 832f3f7c2SPeter Brune /*@ 9ed07d7d7SPeter Brune SNESApplyPC - Calls the function that has been set with SNESSetFunction(). 1032f3f7c2SPeter Brune 1132f3f7c2SPeter Brune Collective on SNES 1232f3f7c2SPeter Brune 1332f3f7c2SPeter Brune Input Parameters: 1432f3f7c2SPeter Brune + snes - the SNES context 1532f3f7c2SPeter Brune - x - input vector 1632f3f7c2SPeter Brune 1732f3f7c2SPeter Brune Output Parameter: 1832f3f7c2SPeter Brune . y - function vector, as set by SNESSetFunction() 1932f3f7c2SPeter Brune 2032f3f7c2SPeter Brune Notes: 2132f3f7c2SPeter Brune SNESComputeFunction() should be called on X before SNESApplyPC() is called, as it is 2232f3f7c2SPeter Brune with SNESComuteJacobian(). 2332f3f7c2SPeter Brune 2432f3f7c2SPeter Brune Level: developer 2532f3f7c2SPeter Brune 2632f3f7c2SPeter Brune .keywords: SNES, nonlinear, compute, function 2732f3f7c2SPeter Brune 2832f3f7c2SPeter Brune .seealso: SNESGetPC(),SNESSetPC(),SNESComputeFunction() 2932f3f7c2SPeter Brune @*/ 3032f3f7c2SPeter Brune PetscErrorCode SNESApplyPC(SNES snes,Vec x,Vec f,PetscReal *fnorm,Vec y) 3132f3f7c2SPeter Brune { 3232f3f7c2SPeter Brune PetscErrorCode ierr; 3332f3f7c2SPeter Brune 3432f3f7c2SPeter Brune PetscFunctionBegin; 3532f3f7c2SPeter Brune PetscValidHeaderSpecific(snes,SNES_CLASSID,1); 3632f3f7c2SPeter Brune PetscValidHeaderSpecific(x,VEC_CLASSID,2); 3732f3f7c2SPeter Brune PetscValidHeaderSpecific(y,VEC_CLASSID,3); 3832f3f7c2SPeter Brune PetscCheckSameComm(snes,1,x,2); 3932f3f7c2SPeter Brune PetscCheckSameComm(snes,1,y,3); 4032f3f7c2SPeter Brune ierr = VecValidValues(x,2,PETSC_TRUE);CHKERRQ(ierr); 4132f3f7c2SPeter Brune if (snes->pc) { 4232f3f7c2SPeter Brune if (f) { 4332f3f7c2SPeter Brune ierr = SNESSetInitialFunction(snes->pc,f);CHKERRQ(ierr); 4432f3f7c2SPeter Brune } 4532f3f7c2SPeter Brune if (fnorm) { 4632f3f7c2SPeter Brune ierr = SNESSetInitialFunctionNorm(snes->pc,*fnorm);CHKERRQ(ierr); 4732f3f7c2SPeter Brune } 4832f3f7c2SPeter Brune ierr = VecCopy(x,y);CHKERRQ(ierr); 4932f3f7c2SPeter Brune ierr = PetscLogEventBegin(SNES_NPCSolve,snes->pc,x,y,0);CHKERRQ(ierr); 5032f3f7c2SPeter Brune ierr = SNESSolve(snes->pc,snes->vec_rhs,y);CHKERRQ(ierr); 5132f3f7c2SPeter Brune ierr = PetscLogEventEnd(SNES_NPCSolve,snes->pc,x,y,0);CHKERRQ(ierr); 5232f3f7c2SPeter Brune ierr = VecAYPX(y,-1.0,x);CHKERRQ(ierr); 5332f3f7c2SPeter Brune ierr = VecValidValues(y,3,PETSC_FALSE);CHKERRQ(ierr); 5432f3f7c2SPeter Brune PetscFunctionReturn(0); 5532f3f7c2SPeter Brune } 5632f3f7c2SPeter Brune ierr = VecValidValues(y,3,PETSC_FALSE);CHKERRQ(ierr); 5732f3f7c2SPeter Brune PetscFunctionReturn(0); 5832f3f7c2SPeter Brune } 5932f3f7c2SPeter Brune 6032f3f7c2SPeter Brune #undef __FUNCT__ 6132f3f7c2SPeter Brune #define __FUNCT__ "SNESComputeFunctionDefaultPC" 62ed07d7d7SPeter Brune PetscErrorCode SNESComputeFunctionDefaultPC(SNES snes,Vec X,Vec F) { 6332f3f7c2SPeter Brune /* This is to be used as an argument to SNESMF -- NOT as a "function" */ 64*b7281c8aSPeter Brune SNESConvergedReason reason; 6532f3f7c2SPeter Brune PetscErrorCode ierr; 66*b7281c8aSPeter Brune 6732f3f7c2SPeter Brune PetscFunctionBegin; 68*b7281c8aSPeter Brune if (snes->pc) { 6932f3f7c2SPeter Brune ierr = SNESApplyPC(snes,X,PETSC_NULL,PETSC_NULL,F);CHKERRQ(ierr); 70*b7281c8aSPeter Brune ierr = SNESGetConvergedReason(snes->pc,&reason);CHKERRQ(ierr); 71*b7281c8aSPeter Brune if (reason < 0 && reason != SNES_DIVERGED_MAX_IT) { 72*b7281c8aSPeter Brune ierr = SNESSetFunctionDomainError(snes);CHKERRQ(ierr); 73*b7281c8aSPeter Brune } 74*b7281c8aSPeter Brune } else { 75*b7281c8aSPeter Brune ierr = SNESComputeFunction(snes,X,F);CHKERRQ(ierr); 76*b7281c8aSPeter Brune } 7732f3f7c2SPeter Brune PetscFunctionReturn(0); 7832f3f7c2SPeter Brune } 79