xref: /petsc/src/tao/linesearch/impls/unit/unit.c (revision a7e14dcfba0d07adf6226a919460249440ec94c7)
1*a7e14dcfSSatish Balay #include "petscvec.h"
2*a7e14dcfSSatish Balay #include "taosolver.h"
3*a7e14dcfSSatish Balay #include "tao-private/taolinesearch_impl.h"
4*a7e14dcfSSatish Balay 
5*a7e14dcfSSatish Balay #undef __FUNCT__
6*a7e14dcfSSatish Balay #define __FUNCT__ "TaoLineSearchDestroy_Unit"
7*a7e14dcfSSatish Balay static PetscErrorCode TaoLineSearchDestroy_Unit(TaoLineSearch ls)
8*a7e14dcfSSatish Balay {
9*a7e14dcfSSatish Balay   PetscErrorCode ierr;
10*a7e14dcfSSatish Balay   PetscFunctionBegin;
11*a7e14dcfSSatish Balay   ierr = PetscFree(ls->data); CHKERRQ(ierr);
12*a7e14dcfSSatish Balay   ls->data = PETSC_NULL;
13*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
14*a7e14dcfSSatish Balay }
15*a7e14dcfSSatish Balay 
16*a7e14dcfSSatish Balay #undef __FUNCT__
17*a7e14dcfSSatish Balay #define __FUNCT__ "TaoLineSearchSetFromOptions_Unit"
18*a7e14dcfSSatish Balay static PetscErrorCode TaoLineSearchSetFromOptions_Unit(TaoLineSearch ls)
19*a7e14dcfSSatish Balay {
20*a7e14dcfSSatish Balay   PetscErrorCode ierr;
21*a7e14dcfSSatish Balay   PetscFunctionBegin;
22*a7e14dcfSSatish Balay   ierr = PetscOptionsHead("No Unit line search options");CHKERRQ(ierr);
23*a7e14dcfSSatish Balay   ierr = PetscOptionsTail();CHKERRQ(ierr);
24*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
25*a7e14dcfSSatish Balay }
26*a7e14dcfSSatish Balay 
27*a7e14dcfSSatish Balay #undef __FUNCT__
28*a7e14dcfSSatish Balay #define __FUNCT__ "TaoLineSearchView_Unit"
29*a7e14dcfSSatish Balay static PetscErrorCode TaoLineSearchView_Unit(TaoLineSearch ls,PetscViewer viewer)
30*a7e14dcfSSatish Balay {
31*a7e14dcfSSatish Balay 
32*a7e14dcfSSatish Balay   PetscErrorCode ierr;
33*a7e14dcfSSatish Balay   PetscBool isascii;
34*a7e14dcfSSatish Balay   PetscFunctionBegin;
35*a7e14dcfSSatish Balay 
36*a7e14dcfSSatish Balay   ierr = PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii); CHKERRQ(ierr);
37*a7e14dcfSSatish Balay   if (isascii) {
38*a7e14dcfSSatish Balay       ierr=PetscViewerASCIIPrintf(viewer,"  Line Search: Unit Step.\n");CHKERRQ(ierr);
39*a7e14dcfSSatish Balay   } else {
40*a7e14dcfSSatish Balay       SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Viewer type %s not supported for Unit TaoLineSearch.",((PetscObject)viewer)->type_name);
41*a7e14dcfSSatish Balay   }
42*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
43*a7e14dcfSSatish Balay }
44*a7e14dcfSSatish Balay 
45*a7e14dcfSSatish Balay #undef __FUNCT__
46*a7e14dcfSSatish Balay #define __FUNCT__ "TaoLineSearchApply_Unit"
47*a7e14dcfSSatish Balay static PetscErrorCode TaoLineSearchApply_Unit(TaoLineSearch ls,Vec x,PetscReal *f,Vec g,Vec step_direction)
48*a7e14dcfSSatish Balay {
49*a7e14dcfSSatish Balay   PetscErrorCode   ierr;
50*a7e14dcfSSatish Balay   PetscReal ftry;
51*a7e14dcfSSatish Balay   PetscReal startf = *f;
52*a7e14dcfSSatish Balay 
53*a7e14dcfSSatish Balay   PetscFunctionBegin;
54*a7e14dcfSSatish Balay 
55*a7e14dcfSSatish Balay   /* Take unit step (newx = startx + 1.0*step_direction) */
56*a7e14dcfSSatish Balay   ierr = VecAXPY(x,1.0,step_direction);CHKERRQ(ierr);
57*a7e14dcfSSatish Balay 
58*a7e14dcfSSatish Balay   ierr = TaoLineSearchComputeObjectiveAndGradient(ls,x,&ftry,g); CHKERRQ(ierr);
59*a7e14dcfSSatish Balay   ierr = PetscInfo1(ls,"Tao Apply Unit Step: %4.4e\n",1.0);
60*a7e14dcfSSatish Balay          CHKERRQ(ierr);
61*a7e14dcfSSatish Balay   if (startf < ftry){
62*a7e14dcfSSatish Balay     ierr = PetscInfo2(ls,"Tao Apply Unit Step, FINCREASE: F old:= %12.10e, F new: %12.10e\n",startf,ftry); CHKERRQ(ierr);
63*a7e14dcfSSatish Balay   }
64*a7e14dcfSSatish Balay   *f = ftry;
65*a7e14dcfSSatish Balay   ls->step = 1.0;
66*a7e14dcfSSatish Balay   ls->reason=TAOLINESEARCH_SUCCESS;
67*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
68*a7e14dcfSSatish Balay }
69*a7e14dcfSSatish Balay 
70*a7e14dcfSSatish Balay EXTERN_C_BEGIN
71*a7e14dcfSSatish Balay #undef __FUNCT__
72*a7e14dcfSSatish Balay #define __FUNCT__ "TaoLineSearchCreate_Unit"
73*a7e14dcfSSatish Balay /*@C
74*a7e14dcfSSatish Balay    TaoCreateUnitLineSearch - Always use step length of 1.0
75*a7e14dcfSSatish Balay 
76*a7e14dcfSSatish Balay    Input Parameters:
77*a7e14dcfSSatish Balay .  tao - TaoSolver context
78*a7e14dcfSSatish Balay 
79*a7e14dcfSSatish Balay 
80*a7e14dcfSSatish Balay    Level: advanced
81*a7e14dcfSSatish Balay 
82*a7e14dcfSSatish Balay .keywords: TaoSolver, linesearch
83*a7e14dcfSSatish Balay @*/
84*a7e14dcfSSatish Balay PetscErrorCode TaoLineSearchCreate_Unit(TaoLineSearch ls)
85*a7e14dcfSSatish Balay {
86*a7e14dcfSSatish Balay 
87*a7e14dcfSSatish Balay   PetscFunctionBegin;
88*a7e14dcfSSatish Balay   ls->ops->setup = 0;
89*a7e14dcfSSatish Balay   ls->ops->apply = TaoLineSearchApply_Unit;
90*a7e14dcfSSatish Balay   ls->ops->view = TaoLineSearchView_Unit;
91*a7e14dcfSSatish Balay   ls->ops->destroy = TaoLineSearchDestroy_Unit;
92*a7e14dcfSSatish Balay   ls->ops->setfromoptions = TaoLineSearchSetFromOptions_Unit;
93*a7e14dcfSSatish Balay 
94*a7e14dcfSSatish Balay   PetscFunctionReturn(0);
95*a7e14dcfSSatish Balay }
96*a7e14dcfSSatish Balay EXTERN_C_END
97*a7e14dcfSSatish Balay 
98