xref: /petsc/src/snes/interface/snesob.c (revision 2a4ee8f29356bf8b2675be8e672539fe9f6aa9db)
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