1 #include <../src/tao/complementarity/impls/ssls/ssls.h> 2 3 /*------------------------------------------------------------*/ 4 PetscErrorCode TaoSetFromOptions_SSLS(PetscOptionItems *PetscOptionsObject,Tao tao) 5 { 6 TAO_SSLS *ssls = (TAO_SSLS *)tao->data; 7 PetscErrorCode ierr; 8 9 PetscFunctionBegin; 10 ierr = PetscOptionsHead(PetscOptionsObject,"Semismooth method with a linesearch for complementarity problems");CHKERRQ(ierr); 11 ierr = PetscOptionsReal("-ssls_delta", "descent test fraction", "",ssls->delta, &ssls->delta, NULL);CHKERRQ(ierr); 12 ierr = PetscOptionsReal("-ssls_rho", "descent test power", "",ssls->rho, &ssls->rho, NULL);CHKERRQ(ierr); 13 ierr = TaoLineSearchSetFromOptions(tao->linesearch);CHKERRQ(ierr); 14 ierr = KSPSetFromOptions(tao->ksp);CHKERRQ(ierr); 15 ierr = PetscOptionsTail();CHKERRQ(ierr); 16 PetscFunctionReturn(0); 17 } 18 19 /*------------------------------------------------------------*/ 20 PetscErrorCode TaoView_SSLS(Tao tao, PetscViewer pv) 21 { 22 PetscFunctionBegin; 23 PetscFunctionReturn(0); 24 } 25 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; 31 PetscErrorCode ierr; 32 33 PetscFunctionBegin; 34 ierr = TaoComputeConstraints(tao, X, tao->constraints);CHKERRQ(ierr); 35 ierr = VecFischer(X,tao->constraints,tao->XL,tao->XU,ssls->ff);CHKERRQ(ierr); 36 ierr = VecNorm(ssls->ff,NORM_2,&ssls->merit);CHKERRQ(ierr); 37 *fcn = 0.5*ssls->merit*ssls->merit; 38 PetscFunctionReturn(0); 39 } 40 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; 46 PetscErrorCode ierr; 47 48 PetscFunctionBegin; 49 ierr = TaoComputeConstraints(tao, X, tao->constraints);CHKERRQ(ierr); 50 ierr = VecFischer(X,tao->constraints,tao->XL,tao->XU,ssls->ff);CHKERRQ(ierr); 51 ierr = VecNorm(ssls->ff,NORM_2,&ssls->merit);CHKERRQ(ierr); 52 *fcn = 0.5*ssls->merit*ssls->merit; 53 54 ierr = TaoComputeJacobian(tao,tao->solution,tao->jacobian,tao->jacobian_pre);CHKERRQ(ierr); 55 56 ierr = MatDFischer(tao->jacobian, tao->solution, tao->constraints,tao->XL, tao->XU, ssls->t1, ssls->t2,ssls->da, ssls->db);CHKERRQ(ierr); 57 ierr = MatDiagonalScale(tao->jacobian,ssls->db,NULL);CHKERRQ(ierr); 58 ierr = MatDiagonalSet(tao->jacobian,ssls->da,ADD_VALUES);CHKERRQ(ierr); 59 ierr = MatMultTranspose(tao->jacobian,ssls->ff,G);CHKERRQ(ierr); 60 PetscFunctionReturn(0); 61 } 62