xref: /petsc/src/tao/complementarity/impls/ssls/ssls.c (revision ffad99011bdf8bdff5e8540ef3c49b4fd8d6e6bb)
1aaa7dc30SBarry Smith #include <../src/tao/complementarity/impls/ssls/ssls.h>
2a7e14dcfSSatish Balay 
3a7e14dcfSSatish Balay /*------------------------------------------------------------*/
4a7e14dcfSSatish Balay #undef __FUNCT__
5a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetFromOptions_SSLS"
6441846f8SBarry Smith PetscErrorCode TaoSetFromOptions_SSLS(Tao tao)
7a7e14dcfSSatish Balay {
8a7e14dcfSSatish Balay   TAO_SSLS       *ssls = (TAO_SSLS *)tao->data;
9a7e14dcfSSatish Balay   PetscErrorCode ierr;
10a7e14dcfSSatish Balay   PetscBool      flg;
11a7e14dcfSSatish Balay 
12a7e14dcfSSatish Balay   PetscFunctionBegin;
1353506e15SBarry Smith   ierr = PetscOptionsHead("Semismooth method with a linesearch for complementarity problems");CHKERRQ(ierr);
1453506e15SBarry Smith   ierr = PetscOptionsReal("-ssls_delta", "descent test fraction", "",ssls->delta, &(ssls->delta), &flg);CHKERRQ(ierr);
1553506e15SBarry Smith   ierr = PetscOptionsReal("-ssls_rho", "descent test power", "",ssls->rho, &(ssls->rho), &flg);CHKERRQ(ierr);
16a7e14dcfSSatish Balay   ierr = TaoLineSearchSetFromOptions(tao->linesearch);CHKERRQ(ierr);
17a7e14dcfSSatish Balay   ierr = KSPSetFromOptions(tao->ksp);CHKERRQ(ierr);
18a7e14dcfSSatish Balay   ierr = PetscOptionsTail();CHKERRQ(ierr);
19a7e14dcfSSatish Balay   PetscFunctionReturn(0);
20a7e14dcfSSatish Balay }
21a7e14dcfSSatish Balay 
22a7e14dcfSSatish Balay /*------------------------------------------------------------*/
23a7e14dcfSSatish Balay #undef __FUNCT__
24a7e14dcfSSatish Balay #define __FUNCT__ "TaoView_SSLS"
25441846f8SBarry Smith PetscErrorCode TaoView_SSLS(Tao tao, PetscViewer pv)
26a7e14dcfSSatish Balay {
27a7e14dcfSSatish Balay   PetscFunctionBegin;
28a7e14dcfSSatish Balay   PetscFunctionReturn(0);
29a7e14dcfSSatish Balay }
30a7e14dcfSSatish Balay 
31a7e14dcfSSatish Balay /*------------------------------------------------------------*/
32a7e14dcfSSatish Balay #undef __FUNCT__
33a7e14dcfSSatish Balay #define __FUNCT__ "Tao_SSLS_Function"
34a7e14dcfSSatish Balay PetscErrorCode Tao_SSLS_Function(TaoLineSearch ls, Vec X, PetscReal *fcn, void *ptr)
35a7e14dcfSSatish Balay {
36441846f8SBarry Smith   Tao            tao = (Tao)ptr;
37a7e14dcfSSatish Balay   TAO_SSLS       *ssls = (TAO_SSLS *)tao->data;
38a7e14dcfSSatish Balay   PetscErrorCode ierr;
39a7e14dcfSSatish Balay 
40a7e14dcfSSatish Balay   PetscFunctionBegin;
41a7e14dcfSSatish Balay   ierr = TaoComputeConstraints(tao, X, tao->constraints);CHKERRQ(ierr);
42a7e14dcfSSatish Balay   ierr = VecFischer(X,tao->constraints,tao->XL,tao->XU,ssls->ff);CHKERRQ(ierr);
43a7e14dcfSSatish Balay   ierr = VecNorm(ssls->ff,NORM_2,&ssls->merit);CHKERRQ(ierr);
44a7e14dcfSSatish Balay   *fcn = 0.5*ssls->merit*ssls->merit;
45a7e14dcfSSatish Balay   PetscFunctionReturn(0);
46a7e14dcfSSatish Balay }
47a7e14dcfSSatish Balay 
48a7e14dcfSSatish Balay /*------------------------------------------------------------*/
49a7e14dcfSSatish Balay #undef __FUNCT__
50a7e14dcfSSatish Balay #define __FUNCT__ "Tao_SSLS_FunctionGradient"
51a7e14dcfSSatish Balay PetscErrorCode Tao_SSLS_FunctionGradient(TaoLineSearch ls, Vec X, PetscReal *fcn,  Vec G, void *ptr)
52a7e14dcfSSatish Balay {
53441846f8SBarry Smith   Tao            tao = (Tao)ptr;
54a7e14dcfSSatish Balay   TAO_SSLS       *ssls = (TAO_SSLS *)tao->data;
55a7e14dcfSSatish Balay   PetscErrorCode ierr;
56a7e14dcfSSatish Balay 
57a7e14dcfSSatish Balay   PetscFunctionBegin;
58a7e14dcfSSatish Balay   ierr = TaoComputeConstraints(tao, X, tao->constraints);CHKERRQ(ierr);
59a7e14dcfSSatish Balay   ierr = VecFischer(X,tao->constraints,tao->XL,tao->XU,ssls->ff);CHKERRQ(ierr);
60a7e14dcfSSatish Balay   ierr = VecNorm(ssls->ff,NORM_2,&ssls->merit);CHKERRQ(ierr);
61a7e14dcfSSatish Balay   *fcn = 0.5*ssls->merit*ssls->merit;
62a7e14dcfSSatish Balay 
63*ffad9901SBarry Smith   ierr = TaoComputeJacobian(tao,tao->solution,tao->jacobian,tao->jacobian_pre);CHKERRQ(ierr);
64a7e14dcfSSatish Balay 
6553506e15SBarry Smith   ierr = D_Fischer(tao->jacobian, tao->solution, tao->constraints,tao->XL, tao->XU, ssls->t1, ssls->t2,ssls->da, ssls->db);CHKERRQ(ierr);
666c23d075SBarry Smith   ierr = MatDiagonalScale(tao->jacobian,ssls->db,NULL);CHKERRQ(ierr);
67a7e14dcfSSatish Balay   ierr = MatDiagonalSet(tao->jacobian,ssls->da,ADD_VALUES);CHKERRQ(ierr);
68a7e14dcfSSatish Balay   ierr = MatMultTranspose(tao->jacobian,ssls->ff,G);CHKERRQ(ierr);
69a7e14dcfSSatish Balay   PetscFunctionReturn(0);
70a7e14dcfSSatish Balay }
71a7e14dcfSSatish Balay 
72