xref: /petsc/src/tao/complementarity/impls/ssls/ssls.c (revision 3ba1676111f5c958fe6c2729b46ca4d523958bb3)
1aaa7dc30SBarry Smith #include <../src/tao/complementarity/impls/ssls/ssls.h>
2a7e14dcfSSatish Balay 
3a7e14dcfSSatish Balay /*------------------------------------------------------------*/
4d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetFromOptions_SSLS(Tao tao, PetscOptionItems *PetscOptionsObject)
5d71ae5a4SJacob Faibussowitsch {
6a7e14dcfSSatish Balay   TAO_SSLS *ssls = (TAO_SSLS *)tao->data;
7a7e14dcfSSatish Balay 
8a7e14dcfSSatish Balay   PetscFunctionBegin;
9d0609cedSBarry Smith   PetscOptionsHeadBegin(PetscOptionsObject, "Semismooth method with a linesearch for complementarity problems");
109566063dSJacob Faibussowitsch   PetscCall(PetscOptionsReal("-ssls_delta", "descent test fraction", "", ssls->delta, &ssls->delta, NULL));
119566063dSJacob Faibussowitsch   PetscCall(PetscOptionsReal("-ssls_rho", "descent test power", "", ssls->rho, &ssls->rho, NULL));
129566063dSJacob Faibussowitsch   PetscCall(TaoLineSearchSetFromOptions(tao->linesearch));
139566063dSJacob Faibussowitsch   PetscCall(KSPSetFromOptions(tao->ksp));
14d0609cedSBarry Smith   PetscOptionsHeadEnd();
15*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
16a7e14dcfSSatish Balay }
17a7e14dcfSSatish Balay 
18a7e14dcfSSatish Balay /*------------------------------------------------------------*/
19d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoView_SSLS(Tao tao, PetscViewer pv)
20d71ae5a4SJacob Faibussowitsch {
21a7e14dcfSSatish Balay   PetscFunctionBegin;
22*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
23a7e14dcfSSatish Balay }
24a7e14dcfSSatish Balay 
25a7e14dcfSSatish Balay /*------------------------------------------------------------*/
26d71ae5a4SJacob Faibussowitsch PetscErrorCode Tao_SSLS_Function(TaoLineSearch ls, Vec X, PetscReal *fcn, void *ptr)
27d71ae5a4SJacob Faibussowitsch {
28441846f8SBarry Smith   Tao       tao  = (Tao)ptr;
29a7e14dcfSSatish Balay   TAO_SSLS *ssls = (TAO_SSLS *)tao->data;
30a7e14dcfSSatish Balay 
31a7e14dcfSSatish Balay   PetscFunctionBegin;
329566063dSJacob Faibussowitsch   PetscCall(TaoComputeConstraints(tao, X, tao->constraints));
339566063dSJacob Faibussowitsch   PetscCall(VecFischer(X, tao->constraints, tao->XL, tao->XU, ssls->ff));
349566063dSJacob Faibussowitsch   PetscCall(VecNorm(ssls->ff, NORM_2, &ssls->merit));
35a7e14dcfSSatish Balay   *fcn = 0.5 * ssls->merit * ssls->merit;
36*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
37a7e14dcfSSatish Balay }
38a7e14dcfSSatish Balay 
39a7e14dcfSSatish Balay /*------------------------------------------------------------*/
40d71ae5a4SJacob Faibussowitsch PetscErrorCode Tao_SSLS_FunctionGradient(TaoLineSearch ls, Vec X, PetscReal *fcn, Vec G, void *ptr)
41d71ae5a4SJacob Faibussowitsch {
42441846f8SBarry Smith   Tao       tao  = (Tao)ptr;
43a7e14dcfSSatish Balay   TAO_SSLS *ssls = (TAO_SSLS *)tao->data;
44a7e14dcfSSatish Balay 
45a7e14dcfSSatish Balay   PetscFunctionBegin;
469566063dSJacob Faibussowitsch   PetscCall(TaoComputeConstraints(tao, X, tao->constraints));
479566063dSJacob Faibussowitsch   PetscCall(VecFischer(X, tao->constraints, tao->XL, tao->XU, ssls->ff));
489566063dSJacob Faibussowitsch   PetscCall(VecNorm(ssls->ff, NORM_2, &ssls->merit));
49a7e14dcfSSatish Balay   *fcn = 0.5 * ssls->merit * ssls->merit;
50a7e14dcfSSatish Balay 
519566063dSJacob Faibussowitsch   PetscCall(TaoComputeJacobian(tao, tao->solution, tao->jacobian, tao->jacobian_pre));
52a7e14dcfSSatish Balay 
539566063dSJacob Faibussowitsch   PetscCall(MatDFischer(tao->jacobian, tao->solution, tao->constraints, tao->XL, tao->XU, ssls->t1, ssls->t2, ssls->da, ssls->db));
549566063dSJacob Faibussowitsch   PetscCall(MatDiagonalScale(tao->jacobian, ssls->db, NULL));
559566063dSJacob Faibussowitsch   PetscCall(MatDiagonalSet(tao->jacobian, ssls->da, ADD_VALUES));
569566063dSJacob Faibussowitsch   PetscCall(MatMultTranspose(tao->jacobian, ssls->ff, G));
57*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
58a7e14dcfSSatish Balay }
59