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