Actual source code: ssls.c
petsc-3.14.6 2021-03-30
1: #include <../src/tao/complementarity/impls/ssls/ssls.h>
3: /*------------------------------------------------------------*/
4: PetscErrorCode TaoSetFromOptions_SSLS(PetscOptionItems *PetscOptionsObject,Tao tao)
5: {
6: TAO_SSLS *ssls = (TAO_SSLS *)tao->data;
10: PetscOptionsHead(PetscOptionsObject,"Semismooth method with a linesearch for complementarity problems");
11: PetscOptionsReal("-ssls_delta", "descent test fraction", "",ssls->delta, &ssls->delta, NULL);
12: PetscOptionsReal("-ssls_rho", "descent test power", "",ssls->rho, &ssls->rho, NULL);
13: TaoLineSearchSetFromOptions(tao->linesearch);
14: KSPSetFromOptions(tao->ksp);
15: PetscOptionsTail();
16: return(0);
17: }
19: /*------------------------------------------------------------*/
20: PetscErrorCode TaoView_SSLS(Tao tao, PetscViewer pv)
21: {
23: return(0);
24: }
26: /*------------------------------------------------------------*/
27: PetscErrorCode Tao_SSLS_Function(TaoLineSearch ls, Vec X, PetscReal *fcn, void *ptr)
28: {
29: Tao tao = (Tao)ptr;
30: TAO_SSLS *ssls = (TAO_SSLS *)tao->data;
34: TaoComputeConstraints(tao, X, tao->constraints);
35: VecFischer(X,tao->constraints,tao->XL,tao->XU,ssls->ff);
36: VecNorm(ssls->ff,NORM_2,&ssls->merit);
37: *fcn = 0.5*ssls->merit*ssls->merit;
38: return(0);
39: }
41: /*------------------------------------------------------------*/
42: PetscErrorCode Tao_SSLS_FunctionGradient(TaoLineSearch ls, Vec X, PetscReal *fcn, Vec G, void *ptr)
43: {
44: Tao tao = (Tao)ptr;
45: TAO_SSLS *ssls = (TAO_SSLS *)tao->data;
49: TaoComputeConstraints(tao, X, tao->constraints);
50: VecFischer(X,tao->constraints,tao->XL,tao->XU,ssls->ff);
51: VecNorm(ssls->ff,NORM_2,&ssls->merit);
52: *fcn = 0.5*ssls->merit*ssls->merit;
54: TaoComputeJacobian(tao,tao->solution,tao->jacobian,tao->jacobian_pre);
56: MatDFischer(tao->jacobian, tao->solution, tao->constraints,tao->XL, tao->XU, ssls->t1, ssls->t2,ssls->da, ssls->db);
57: MatDiagonalScale(tao->jacobian,ssls->db,NULL);
58: MatDiagonalSet(tao->jacobian,ssls->da,ADD_VALUES);
59: MatMultTranspose(tao->jacobian,ssls->ff,G);
60: return(0);
61: }