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