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