1*2a4ee8f2SPeter Brune #include <petsc-private/snesimpl.h> 2*2a4ee8f2SPeter Brune 3*2a4ee8f2SPeter Brune #undef __FUNCT__ 4*2a4ee8f2SPeter Brune #define __FUNCT__ "SNESSetObjective" 5*2a4ee8f2SPeter Brune /*@C 6*2a4ee8f2SPeter Brune SNESSetObjective - Sets the objective function minimized by 7*2a4ee8f2SPeter Brune the SNES methods. 8*2a4ee8f2SPeter Brune 9*2a4ee8f2SPeter Brune Logically Collective on SNES 10*2a4ee8f2SPeter Brune 11*2a4ee8f2SPeter Brune Input Parameters: 12*2a4ee8f2SPeter Brune + snes - the SNES context 13*2a4ee8f2SPeter Brune . func - objective evaluation routine 14*2a4ee8f2SPeter Brune - ctx - [optional] user-defined context for private data for the 15*2a4ee8f2SPeter Brune function evaluation routine (may be PETSC_NULL) 16*2a4ee8f2SPeter Brune 17*2a4ee8f2SPeter Brune Calling sequence of func: 18*2a4ee8f2SPeter Brune $ func (SNES snes,Vec x,PetscReal *obj,void *ctx); 19*2a4ee8f2SPeter Brune 20*2a4ee8f2SPeter Brune + snes - the SNES context 21*2a4ee8f2SPeter Brune . X - solution 22*2a4ee8f2SPeter Brune . F - current function/gradient 23*2a4ee8f2SPeter Brune . obj - real to hold the objective value 24*2a4ee8f2SPeter Brune - ctx - optional user-defined objective context 25*2a4ee8f2SPeter Brune 26*2a4ee8f2SPeter Brune Level: beginner 27*2a4ee8f2SPeter Brune 28*2a4ee8f2SPeter Brune .keywords: SNES, nonlinear, set, objective 29*2a4ee8f2SPeter Brune 30*2a4ee8f2SPeter Brune .seealso: SNESGetObjective(), SNESComputeObjective(), SNESSetFunction(), SNESSetJacobian() 31*2a4ee8f2SPeter Brune @*/ 32*2a4ee8f2SPeter Brune PetscErrorCode SNESSetObjective(SNES snes,SNESObjective func,void *ctx) 33*2a4ee8f2SPeter Brune { 34*2a4ee8f2SPeter Brune PetscErrorCode ierr; 35*2a4ee8f2SPeter Brune DM dm; 36*2a4ee8f2SPeter Brune 37*2a4ee8f2SPeter Brune PetscFunctionBegin; 38*2a4ee8f2SPeter Brune PetscValidHeaderSpecific(snes,SNES_CLASSID,1); 39*2a4ee8f2SPeter Brune ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr); 40*2a4ee8f2SPeter Brune ierr = DMSNESSetObjective(dm,func,ctx);CHKERRQ(ierr); 41*2a4ee8f2SPeter Brune PetscFunctionReturn(0); 42*2a4ee8f2SPeter Brune } 43*2a4ee8f2SPeter Brune 44*2a4ee8f2SPeter Brune #undef __FUNCT__ 45*2a4ee8f2SPeter Brune #define __FUNCT__ "SNESGetObjective" 46*2a4ee8f2SPeter Brune /*@C 47*2a4ee8f2SPeter Brune SNESGetObjective - Returns the objective function. 48*2a4ee8f2SPeter Brune 49*2a4ee8f2SPeter Brune Not Collective 50*2a4ee8f2SPeter Brune 51*2a4ee8f2SPeter Brune Input Parameter: 52*2a4ee8f2SPeter Brune . snes - the SNES context 53*2a4ee8f2SPeter Brune 54*2a4ee8f2SPeter Brune Output Parameter: 55*2a4ee8f2SPeter Brune + func - the function (or PETSC_NULL) 56*2a4ee8f2SPeter Brune - ctx - the function context (or PETSC_NULL) 57*2a4ee8f2SPeter Brune 58*2a4ee8f2SPeter Brune Level: advanced 59*2a4ee8f2SPeter Brune 60*2a4ee8f2SPeter Brune .keywords: SNES, nonlinear, get, objective 61*2a4ee8f2SPeter Brune 62*2a4ee8f2SPeter Brune .seealso: SNESSetObjective(), SNESGetSolution() 63*2a4ee8f2SPeter Brune @*/ 64*2a4ee8f2SPeter Brune PetscErrorCode SNESGetObjective(SNES snes,SNESObjective *func,void **ctx) 65*2a4ee8f2SPeter Brune { 66*2a4ee8f2SPeter Brune PetscErrorCode ierr; 67*2a4ee8f2SPeter Brune DM dm; 68*2a4ee8f2SPeter Brune PetscFunctionBegin; 69*2a4ee8f2SPeter Brune PetscValidHeaderSpecific(snes,SNES_CLASSID,1); 70*2a4ee8f2SPeter Brune ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr); 71*2a4ee8f2SPeter Brune ierr = DMSNESGetObjective(dm,func,ctx);CHKERRQ(ierr); 72*2a4ee8f2SPeter Brune PetscFunctionReturn(0); 73*2a4ee8f2SPeter Brune } 74*2a4ee8f2SPeter Brune 75*2a4ee8f2SPeter Brune #undef __FUNCT__ 76*2a4ee8f2SPeter Brune #define __FUNCT__ "SNESComputeObjective" 77*2a4ee8f2SPeter Brune /*@C 78*2a4ee8f2SPeter Brune SNESComputeObjective - Computes the objective. 79*2a4ee8f2SPeter Brune 80*2a4ee8f2SPeter Brune Collective on SNES 81*2a4ee8f2SPeter Brune 82*2a4ee8f2SPeter Brune Input Parameter: 83*2a4ee8f2SPeter Brune + snes - the SNES context 84*2a4ee8f2SPeter Brune - X - the state vector 85*2a4ee8f2SPeter Brune 86*2a4ee8f2SPeter Brune Output Parameter: 87*2a4ee8f2SPeter Brune . ob - the objective value 88*2a4ee8f2SPeter Brune 89*2a4ee8f2SPeter Brune Level: advanced 90*2a4ee8f2SPeter Brune 91*2a4ee8f2SPeter Brune .keywords: SNES, nonlinear, compute, objective 92*2a4ee8f2SPeter Brune 93*2a4ee8f2SPeter Brune .seealso: SNESSetObjective(), SNESGetSolution() 94*2a4ee8f2SPeter Brune @*/ 95*2a4ee8f2SPeter Brune PetscErrorCode SNESComputeObjective(SNES snes,Vec X,PetscReal *ob) 96*2a4ee8f2SPeter Brune { 97*2a4ee8f2SPeter Brune PetscErrorCode ierr; 98*2a4ee8f2SPeter Brune DM dm; 99*2a4ee8f2SPeter Brune SNESDM sdm; 100*2a4ee8f2SPeter Brune PetscFunctionBegin; 101*2a4ee8f2SPeter Brune PetscValidHeaderSpecific(snes,SNES_CLASSID,1); 102*2a4ee8f2SPeter Brune PetscValidHeaderSpecific(X,VEC_CLASSID,2); 103*2a4ee8f2SPeter Brune PetscValidPointer(ob,3); 104*2a4ee8f2SPeter Brune ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr); 105*2a4ee8f2SPeter Brune ierr = DMSNESGetContext(dm,&sdm);CHKERRQ(ierr); 106*2a4ee8f2SPeter Brune if (sdm->computeobjective) { 107*2a4ee8f2SPeter Brune ierr = (sdm->computeobjective)(snes,X,ob,sdm->objectivectx);CHKERRQ(ierr); 108*2a4ee8f2SPeter Brune } else { 109*2a4ee8f2SPeter Brune SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE, "Must call SNESSetObjective() before SNESComputeObjective()."); 110*2a4ee8f2SPeter Brune } 111*2a4ee8f2SPeter Brune PetscFunctionReturn(0); 112*2a4ee8f2SPeter Brune } 113