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