xref: /petsc/src/tao/complementarity/impls/ssls/ssls.c (revision d0609ced746bc51b019815ca91d747429db24893)
1aaa7dc30SBarry Smith #include <../src/tao/complementarity/impls/ssls/ssls.h>
2a7e14dcfSSatish Balay 
3a7e14dcfSSatish Balay /*------------------------------------------------------------*/
44416b707SBarry Smith PetscErrorCode TaoSetFromOptions_SSLS(PetscOptionItems *PetscOptionsObject,Tao tao)
5a7e14dcfSSatish Balay {
6a7e14dcfSSatish Balay   TAO_SSLS       *ssls = (TAO_SSLS *)tao->data;
7a7e14dcfSSatish Balay 
8a7e14dcfSSatish Balay   PetscFunctionBegin;
9*d0609cedSBarry 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));
14*d0609cedSBarry Smith   PetscOptionsHeadEnd();
15a7e14dcfSSatish Balay   PetscFunctionReturn(0);
16a7e14dcfSSatish Balay }
17a7e14dcfSSatish Balay 
18a7e14dcfSSatish Balay /*------------------------------------------------------------*/
19441846f8SBarry Smith PetscErrorCode TaoView_SSLS(Tao tao, PetscViewer pv)
20a7e14dcfSSatish Balay {
21a7e14dcfSSatish Balay   PetscFunctionBegin;
22a7e14dcfSSatish Balay   PetscFunctionReturn(0);
23a7e14dcfSSatish Balay }
24a7e14dcfSSatish Balay 
25a7e14dcfSSatish Balay /*------------------------------------------------------------*/
26a7e14dcfSSatish Balay PetscErrorCode Tao_SSLS_Function(TaoLineSearch ls, Vec X, PetscReal *fcn, void *ptr)
27a7e14dcfSSatish Balay {
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;
36a7e14dcfSSatish Balay   PetscFunctionReturn(0);
37a7e14dcfSSatish Balay }
38a7e14dcfSSatish Balay 
39a7e14dcfSSatish Balay /*------------------------------------------------------------*/
40a7e14dcfSSatish Balay PetscErrorCode Tao_SSLS_FunctionGradient(TaoLineSearch ls, Vec X, PetscReal *fcn,  Vec G, void *ptr)
41a7e14dcfSSatish Balay {
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));
57a7e14dcfSSatish Balay   PetscFunctionReturn(0);
58a7e14dcfSSatish Balay }
59